- 책 또는 웹사이트의 내용을 복제하여 다른 곳에 게시하는 것을 금지합니다.
- 책 또는 웹사이트의 내용을 발췌, 요약하여 강의 자료, 발표 자료, 블로그 포스팅 등으로 만드는 것을 금지합니다.
Docker 사용해보기
Docker의 명령은 docker run
, docker push
와 같이 docker <명령>
형식이며, 항상 root 권한으로 실행해야 합니다.
먼저 Docker의 기본적인 사용 방법을 알아보기 위해 Docker Hub에서 제공하는 이미지를 받아서 실행해보겠습니다.
search 명령으로 이미지 검색하기
Docker는 Docker Hub(https://hub.docker.com)를 통해 이미지를 공유하는 생태계가 구축되어 있습니다. 유명 리눅스 배포판과 오픈 소스 프로젝트(Redis, Nginx 등)의 Docker 이미지는 모두 Docker Hub에서 구할 수 있습니다. 특히 이미지와 관련된 모든 명령은 기본적으로 Docker Hub를 이용하도록 설정되어 있습니다.
docker search
명령으로 Docker Hub에서 이미지를 검색할 수 있습니다.
$ sudo docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 14904 [OK]
websphere-liberty WebSphere Liberty multi-architecture images … 288 [OK]
ubuntu-upstart DEPRECATED, as is Upstart (find other proces… 112 [OK]
neurodebian NeuroDebian provides neuroscience research s… 92 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 58
open-liberty Open Liberty multi-architecture images based… 54 [OK]
ubuntu-debootstrap DEPRECATED; use "ubuntu" instead 46 [OK]
다양한 이미지가 검색될 것입니다. 보통 ubuntu, centos, redis 등 OS나 프로그램 이름을 가진 이미지가 공식 이미지입니다. 나머지는 사용자들이 만들어 공개한 이미지입니다.
Docker Hub에서 이미지를 검색한 뒤 해당 이미지의 Tags 탭을 보면 현재 사용할 수 있는 이미지의 버전을 볼 수 있습니다.
sudo 입력하지 않기
docker 명령은 root 권한으로 실행해야 하기 때문에 일반 계정에서는 항상 sudo를 사용합니다. sudo를 매번 입력하기 귀찮기도 하고 빠뜨릴 때도 많습니다. sudo를 입력하지 않는 방법은 두 가지가 있습니다.
- 처음부터 root 계정으로 로그인하거나
sudo su
명령을 사용하여 root 계정으로 전환
$ sudo su
#
- 현재 계정을 docker 그룹에 포함(docker 그룹은 root 권한과 동일하므로 꼭 필요한 계정만 포함시킵니다).
$ sudo usermod -aG docker ${USER}
$ sudo systemctl restart docker
현재 계정에서 로그아웃한 뒤 다시 로그인합니다.
pull 명령으로 이미지 받기
Docker Hub에서 우분투 리눅스 이미지를 받아보겠습니다.
$ sudo docker pull ubuntu:latest
docker pull <이미지 이름>:<태그>
형식입니다. latest를 설정하면 최신 버전을 받습니다. ubuntu:22.04, ubuntu:20.10처럼 태그를 지정해 줄 수도 있습니다.
이미지 이름에서 pyrasis/ubuntu처럼 / 앞에 사용자명을 지정하면 Docker Hub에서 해당 사용자가 올린 이미지를 받습니다. 공식 이미지는 사용자명이 붙지 않습니다.
참고
호스트에 설치된 리눅스 배포판과 Docker 이미지의 배포판의 종류가 달라도 됩니다. CentOS에서 우분투 컨테이너를 실행할 수 있습니다.
images 명령으로 이미지 목록 출력하기
이제 받은 이미지의 목록을 출력해보겠습니다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 2dc39ba059dc 7 days ago 77.8MB
docker images
명령은 모든 이미지 목록을 출력합니다. docker images ubuntu
처럼 이미지 이름을 설정하면 이름은 같지만 태그가 다른 이미지가 출력됩니다.
run 명령으로 컨테이너 생성하기
이미지를 컨테이너로 생성한 뒤 Bash 셸을 실행해보겠습니다.
$ sudo docker run -i -t --name hello ubuntu /bin/bash
docker run <옵션> <이미지 이름> <실행할 파일>
형식입니다. 여기서는 ubunbu 이미지를 컨테이너로 생성한 뒤 ubuntu 이미지 안의 /bin/bash를 실행합니다. 이미지 이름 대신 이미지 ID를 사용해도 됩니다.
-i
(interactive),-t
(Pseudo-tty) 옵션을 사용하면 실행된 Bash 셸에 입력 및 출력을 할 수 있습니다.--name
옵션으로 컨테이너의 이름을 지정할 수 있습니다. 이름을 지정하지 않으면 Docker가 자동으로 이름을 생성하여 지정합니다.
이제 호스트 OS와 완전히 격리된 공간이 생성되었습니다. cd, ls 명령으로 컨테이너 내부를 한번 둘러봅니다. 호스트 OS와는 다르다는 것을 알 수 있습니다. exit를 입력하여 Bash 셸에서 빠져나옵니다. 우분투 이미지에서 /bin/bash 실행 파일을 직접 실행했기 때문에 여기서 빠져나오면 컨테이너가 정지(stop)됩니다.
ps 명령으로 컨테이너 목록 확인하기
다음 명령을 입력하여 모든 컨테이너 목록을 출력합니다.
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8b0bf04c340 ubuntu "/bin/bash" 5 seconds ago Exited (0) 3 seconds ago hello
docker ps
형식입니다. -a
옵션을 사용하면 정지된 컨테이너까지 모두 출력하고, 옵션을 사용하지 않으면 실행되고 있는 컨테이너만 출력합니다.
우리는 앞에서 컨테이너를 생성할 때 이름을 hello로 지정했으므로 컨테이너 목록에서도 hello로 표시됩니다.
start 명령으로 컨테이너 시작하기
방금 정지한 컨테이너를 다시금 시작해보겠습니다.
$ sudo docker start hello
docker start <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
다음 명령을 입력하여 실행된 컨테이너 목록을 출력합니다.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8b0bf04c340 ubuntu "/bin/bash" 40 seconds ago Up 4 seconds hello
hello 컨테이너가 시작되었습니다.
restart 명령으로 컨테이너 재시작하기
OS 재부팅처럼 컨테이너를 재시작해보겠습니다.
$ sudo docker restart hello
docker restart <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
attach 명령으로 컨테이너에 접속하기
이제 시작한 컨테이너에 접속해보겠습니다. 다음 명령을 실행한 뒤 엔터를 한번 더 입력하면 Bash 셸이 표시됩니다.
$ sudo docker attach hello
root@f8b0bf04c340:/#
docker attach <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
우리는 /bin/bash를 실행했기 때문에 명령을 자유롭게 입력할 수 있지만, DB나 서버 애플리케이션을 실행하면 입력은 할 수 없고 출력만 보게 됩니다.
Bash 셸에서 exit 또는 Ctrl+D를 입력하면 컨테이너가 정지됩니다. 여기서는 Ctrl+P, Ctrl+Q를 차례대로 입력하여 컨테이너를 정지하지 않고, 컨테이너에서 빠져나옵니다.
exec 명령으로 외부에서 컨테이너 안의 명령 실행하기
현재 컨테이너가 /bin/bash로 실행된 상태입니다. 이번에는 /bin/bash를 통하지 않고 외부에서 컨테이너 안의 명령을 실행해보겠습니다.
$ sudo docker exec hello echo "Hello World"
Hello World
docker exec <컨테이너 이름> <명령> <매개 변수>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다. 컨테이너가 실행되고 있는 상태에서만 사용할 수 있으며 정지된 상태에서는 사용할 수 없습니다.
컨테이너 안의 echo
명령을 실행하고 매개 변수로 "Hello World"를 지정했기 때문에 Hello World가 출력됩니다. docker exec
명령은 이미 실행된 컨테이너에 apt-get
, yum
명령으로 패키지를 설치하거나, 각종 데몬을 실행할 때 활용할 수 있습니다.
stop 명령으로 컨테이너 정지하기
이번에는 컨테이너를 정지해보겠습니다. 먼저 실행된 컨테이너 목록을 출력합니다.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8b0bf04c340 ubuntu "/bin/bash" 2 minutes ago Up About a minute hello
다음 명령으로 컨테이너를 정지합니다.
$ sudo docker stop hello
docker stop <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
실행된 컨테이너 목록을 출력합니다.
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
hello 컨테이너를 정지했기 때문에 아무것도 안 나옵니다.
rm 명령으로 컨테이너 삭제하기
생성된 컨테이너를 삭제해보겠습니다.
$ sudo docker rm hello
docker rm <컨테이너 이름>
형식입니다. 컨테이너 이름 대신 컨테이너 ID를 사용해도 됩니다.
모든 컨테이너 목록을 출력합니다.
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
hello 컨테이너를 삭제했기 때문에 아무것도 안 나옵니다.
rmi 명령으로 이미지 삭제하기
이번에는 이미지를 삭제해보겠습니다.
$ sudo docker rmi ubuntu:latest
docker rmi <이미지 이름>:<태그>
형식입니다. 이미지 이름 대신 이미지 ID를 사용해도 됩니다. docker rmi ubuntu
처럼 이미지 이름만 지정하면 태그는 다르지만 ubuntu 이름을 가진 모든 이미지가 삭제됩니다.
이미지 목록을 출력합니다.
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 이미지를 삭제했기 때문에 아무것도 안 나옵니다.
저작권 안내
이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.- 블로그, 게시판 등에 퍼가는 것을 금지합니다.
- 비공개 포스트에 퍼가는 것을 금지합니다.
- 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
- 링크 및 SNS 공유는 허용합니다.