Install Docker

Get Docker Engine

다음 공식 링크를 참조하기 바란다. (https://docs.docker.com/install/linux/docker-ce/ubuntu/)

  • Docker repository 를 사용하는 것을 권장함
  • DEB 패키지를 사용하여 수동으로 설치 및 업그레이드를 관리할 수 있음 (인터넷에 접속이 불가한 경우 유용)
  • 스크립트를 사용하여 설치할 수 있음

1. SET UP THE REPOSITORY

1-1) apt 패키지를 업데이트 한다:

sudo apt update

1-2) apt 를 통해 업데이트 할 수 있도록 패키지를 설치한다:

sudo apt install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

1-3) GPG key 를 추가한다:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 이상이 발생하는 경우 다음을 통해 키를 확인한다.
sudo apt-key fingerprint 0EBFCD88

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

1-4) docker repository 를 설정한다:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

2. INSTALL DOCKER ENGINE

2-1) apt 패키지를 업데이트 한다:

sudo apt update

2-2) docker engine 최신 버전을 설치한다:

sudo apt-get install docker-ce docker-ce-cli containerd.io
  • 특정 버전을 사용하는 경우 다음을 확인한다:
apt-cache madison docker-ce

  docker-ce | 5:18.09.1~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu  xenial/stable amd64 Packages
  docker-ce | 5:18.09.0~3-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu  xenial/stable amd64 Packages
  docker-ce | 18.06.1~ce~3-0~ubuntu       | https://download.docker.com/linux/ubuntu  xenial/stable amd64 Packages
  docker-ce | 18.06.0~ce~3-0~ubuntu       | https://download.docker.com/linux/ubuntu  xenial/stable amd64 Packages
  ...
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
  • docker 를 root 권한으로 실행할 수 있도록 한다:
sudo usermod -aG docker $USER

3. REMOVE DOCKER

3-1) docker engine 패키지를 제거한다:

sudo apt purge docker-ce

3-2) 모든 이미지, 컨테이너, 볼륨을 삭제한다:

  • 호스트 이미지, 컨테이너, 볼륨, 사용자 정의 구성 파일은 자동으로 제거되지 않기 때문
sudo rm -rf /var/lib/docker

Docker Commands

1. SEARCH IMAGE

Docker 는 기본적으로 Docker Hub (URL: https://hub.docker.com/) 을 통해 image 를 공유한다. 대부분의 리눅스 배포판, 오픈소스 등의 image 는 이미 Docker Hub 에서 제공한다.

docker search 명령을 사용하면 Docker Hub 의 image 를 검색할 수 있는데 랭킹을 구성해서 높은 순서대로 25 개의 리스트가 검색된다. (모든 버전이 검색되는 것은 아님)

$ docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   10530               [OK]
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   393                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   243                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   210                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   105                 [OK]
ansible/ubuntu14.04-ansible                               Ubuntu 14.04 LTS with ansible                   98                                      [OK]
neurodebian                                               NeuroDebian provides neuroscience research s…   64                  [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5      ubuntu-16-nginx-php-phpmyadmin-mysql-5          50                                      [OK]
ubuntu-debootstrap                                        debootstrap --variant=minbase --components=m…   42                  [OK]
nuagebec/ubuntu                                           Simple always updated Ubuntu docker images w…   24                                      [OK]
i386/ubuntu                                               Ubuntu is a Debian-based Linux operating sys…   19
1and1internet/ubuntu-16-apache-php-5.6                    ubuntu-16-apache-php-5.6                        14                                      [OK]
1and1internet/ubuntu-16-apache-php-7.0                    ubuntu-16-apache-php-7.0                        13                                      [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mariadb-10   ubuntu-16-nginx-php-phpmyadmin-mariadb-10       11                                      [OK]
1and1internet/ubuntu-16-nginx-php-5.6                     ubuntu-16-nginx-php-5.6                         8                                       [OK]
1and1internet/ubuntu-16-nginx-php-5.6-wordpress-4         ubuntu-16-nginx-php-5.6-wordpress-4             7                                       [OK]
1and1internet/ubuntu-16-apache-php-7.1                    ubuntu-16-apache-php-7.1                        6                                       [OK]
darksheer/ubuntu                                          Base Ubuntu Image -- Updated hourly             5                                       [OK]
1and1internet/ubuntu-16-nginx-php-7.0                     ubuntu-16-nginx-php-7.0                         4                                       [OK]
pivotaldata/ubuntu                                        A quick freshening-up of the base Ubuntu doc…   3
pivotaldata/ubuntu16.04-build                             Ubuntu 16.04 image for GPDB compilation         2
1and1internet/ubuntu-16-sshd                              ubuntu-16-sshd                                  1                                       [OK]
1and1internet/ubuntu-16-php-7.1                           ubuntu-16-php-7.1                               1                                       [OK]
pivotaldata/ubuntu-gpdb-dev                               Ubuntu images for GPDB development              1
smartentry/ubuntu                                         ubuntu with smartentry                          1                                       [OK]

대표적으로 ‘ubuntu’ 를 검색해보면 그 결과는 위와 같다. 결과에서 ‘/’ 로 나누어 지는 부분은 사용자들이 만들어 공개한 이미지이다.

Docker Hub 페이지에서 ‘ubuntu’ 를 검색할 수 있다. 검색의 결과는 다음 링크 에서 확인가능하며 ‘Docker Official Images’ 를 선택하면 세부 정보를 확인할 수 있다. 예를들어 ubuntu image Tags 탭을 보면 현재 버전정보를 확인할 수 있다.

2. PULL IMAGE

docker pull 명령을 사용하여 image 를 다운로드 받을 수 있는데 ‘검색’ 후 원하는 image Name 과 Tag 를 사용하면 된다.

‘search’ 과정에서 검색한 ‘ubuntu’ 를 예로들면 다음과 같다:

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
5c939e3a4d10: Pull complete
c63719cdbe7a: Pull complete
19a861ea6baf: Pull complete
651c9d2d6c4f: Pull complete
Digest: sha256:8d31dad0c58f552e890d68bbfb735588b6b820a46e459672d96e585871acc110
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

‘Using default tag: latest’ 구문에서 볼 수 있듯 tag 정보를 사용하지 않으면 자동적으로 최신 tag 가 적용되는 것을 확인할 수 있다.

또한 아래와 같이 다양한 구성으로 image 를 받을 수 있다:

$ docker pull ubuntu:latest

$ docker pull ubuntu:18.04

$ docker pull smartentry/ubuntu

image 이름에서 ‘smartentry/unbuntu’ 와 같이 ‘/’ 앞에 사용자를 지정하면 해당 사용자가 Docker Hub 에 push 한 image 를 다운로드 하게 된다.

공식 image 의 경우 사용자 지정을 사용하지 않는다.

3. CHECK DOCKER IMAGE LIST

docker pull 명령어로 다운로드 받은 image 가 호스트에 정상적으로 반영되었는지 확인하기 위해 docker images 명령어를 사용한다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ccc6e87d482b        5 weeks ago         64.2MB

$ docker images ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ccc6e87d482b        5 weeks ago         64.2MB

docker images <image Name> 을 사용하면 image Name 에 해당하는 정보만 출력된다. 이름은 같지만 태그가 다른 이미지도 확인할 수 있다.

4. RUN CONTAINER

호스트에 다운로드 된 image 를 이용하여 Container 를 실행시키기 위해서는 docker run 명령어를 사용한다.

$ docker run -i -t --name test ubuntu /bin/bash
root@f3ca7c49d662:/#

명령어 구성은 docker run <옵션> <image Name> <task> 형식을 사용한다. 위 예제는 ‘ubuntu’ image 를 사용하여 Container 를 생성하고 ‘/bin/bash’ 를 실행하는 의미인데 세부적인 내용은 다음과 같다:

  • -i (interactive), -t (Pseudo-tty) 옵션: ‘bash’ 쉘에 입출력을 위해 대기
  • --name 옵션: Container Name 설정 (Name 지정이 없으면 자동생성)

호스트와 격리된 Container 가 생성되었다는 의미이며 ‘bash’ 쉘에서 대기상태이기 때문에 linux 명령어들을 적용하여 동작하는지 확인한다.

root@f3ca7c49d662:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@f3ca7c49d662:/# cd home/
root@f3ca7c49d662:/home# cd ..
root@f3ca7c49d662:/# cd usr/
bin/     games/   include/ lib/     local/   sbin/    share/   src/
root@f3ca7c49d662:/# cd usr/local/
bin/     etc/     games/   include/ lib/     man/     sbin/    share/   src/

‘bash’ 쉘에 exit 를 입력하면 쉘에서 빠져나오게 되며 이 의미는 ‘ubuntu’ image 에서 ‘/bin/bash’ 실행이 종료되어 Container 가 정지 (STOP) 된다는 의미이다.

root@f3ca7c49d662:/usr/local/bin# exit
exit
$

5. CHECK CONTAINER LIST

호스트에서 만들어진 Container 목록은 docker ps 명령을 사용하여 확인할 수 있다.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
f3ca7c49d662        ubuntu              "/bin/bash"         15 minutes ago      Exited (0) About a minute ago                       test

docker ps <option> 형식으로 구성되어 있는데 -a 옵션은 모든 Container 목록 (정지, 실행) 을 출력하는 의미이며 옵션이 없으면 실행중인 Container 만 출력한다.

위 예에서 Container 생성에 ‘–name’ 으로 지정한 Container Name 인 ‘test’ 를 확인할 수 있다.

6. CONTAINER START

정지한 Container 를 시작하기 위해 docker start 명령어를 사용한다.

$ docker start test
test

docker start <Container Name | Container ID> 형식을 사용한다.

‘start’ 명령이 정상 동작하는지 확인하기 위해 Container 목록을 출력하여 상태를 확인한다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f3ca7c49d662        ubuntu              "/bin/bash"         20 minutes ago      Up 15 seconds                           test

‘test’ 이름의 Container 가 ‘Up 15 seconds’ 임을 확인할 수 있다.

7. CONTAINER RESTART

Container 를 재실행 시키기 위해 docker restart 명령어를 사용한다.

$ docker restart test
test

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f3ca7c49d662        ubuntu              "/bin/bash"         35 minutes ago      Up 5 seconds                            test

8. CONNECTION CONTAINER

Container 가 시작된 후 Container 에 접속하기 위해 docker attach 명령어를 사용한다.

$ docker attach test
root@f3ca7c49d662:/#

docker attach <Container Name | ID> 형식을 사용하는데 주의할 점이 있다.

위 예에서는 ‘/bin/bash’ 를 실행하였기 때문에 명령어를 입력할 수 있지만 application 을 실행하는 경우라면 출력만 확인하게 된다.

쉘에서 ‘exit, ctrl+D’ 를 사용하면 Container 가 정지되며 빠져나오게 되며 ‘ctrl+P, ctrl+Q’ 를 입력하면 Container 를 정지하지 않고 빠져나오게 된다.

root@f3ca7c49d662:/# read escape sequence

9. TASK RUN

외부에서 Container 의 ‘task’ 를 실행시키기 위해 docker exec 명령어를 사용한다.

$ docker exec test echo "Hello World"
Hello World

docker exec <Container Name | ID> <task> <parameter> 형식으로 구성되는데 Container 가 실행중인 상태에서만 동작한다.

위 예에서는 ‘test’ 라는 이름의 Container 내부에 ‘echo’ 라는 task 를 실행하고 파라메터로 ‘Hello World’ 를 지정한 동작을 보여준다.

이를 사용하면 실행중인 Container 에 apt install, ‘git clone` 등의 명령으로 패키지를 설치하거나 실행할 수 있다.

$ docker exec -i -t test /bin/bash
root@f3ca7c49d662:/# apt update
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [823 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
Get:5 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]
Get:6 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [13.5 kB]
Get:7 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [186 kB]
Get:8 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [11.3 MB]
Get:9 http://security.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [31.0 kB]
Get:10 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [836 kB]
Get:11 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7348 B]
Get:12 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1344 kB]
Get:13 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [1124 kB]
Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1350 kB]
Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [44.7 kB]
Get:16 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [11.4 kB]
Get:17 http://archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [2496 B]
Get:18 http://archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [4252 B]
Fetched 17.6 MB in 28s (639 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
18 packages can be upgraded. Run 'apt list --upgradable' to see them.

root@f3ca7c49d662:/# apt install git
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  ca-certificates git-man krb5-locales less libasn1-8-heimdal libbsd0 libcurl3-gnutls libedit2 liberror-perl libexpat1 libgdbm-compat4 libgdbm5 libgssapi-krb5-2
  libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libk5crypto3 libkeyutils1 libkrb5-26-heimdal libkrb5-3
  libkrb5support0 libldap-2.4-2 libldap-common libnghttp2-14 libperl5.26 libpsl5 libroken18-heimdal librtmp1 libsasl2-2 libsasl2-modules libsasl2-modules-db
  libsqlite3-0 libssl1.0.0 libssl1.1 libwind0-heimdal libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1 multiarch-support netbase openssh-client
  openssl patch perl perl-modules-5.26 publicsuffix xauth
Suggested packages:
  gettext-base git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn gdbm-l10n krb5-doc krb5-user
  libsasl2-modules-gssapi-mit | libsasl2-modules-gssapi-heimdal libsasl2-modules-ldap libsasl2-modules-otp libsasl2-modules-sql keychain libpam-ssh monkeysphere
  ssh-askpass ed diffutils-doc perl-doc libterm-readline-gnu-perl | libterm-readline-perl-perl make
The following NEW packages will be installed:
  ca-certificates git git-man krb5-locales less libasn1-8-heimdal libbsd0 libcurl3-gnutls libedit2 liberror-perl libexpat1 libgdbm-compat4 libgdbm5
  libgssapi-krb5-2 libgssapi3-heimdal libhcrypto4-heimdal libheimbase1-heimdal libheimntlm0-heimdal libhx509-5-heimdal libk5crypto3 libkeyutils1
  libkrb5-26-heimdal libkrb5-3 libkrb5support0 libldap-2.4-2 libldap-common libnghttp2-14 libperl5.26 libpsl5 libroken18-heimdal librtmp1 libsasl2-2
  libsasl2-modules libsasl2-modules-db libsqlite3-0 libssl1.0.0 libssl1.1 libwind0-heimdal libx11-6 libx11-data libxau6 libxcb1 libxdmcp6 libxext6 libxmuu1
  multiarch-support netbase openssh-client openssl patch perl perl-modules-5.26 publicsuffix xauth
0 upgraded, 54 newly installed, 0 to remove and 18 not upgraded.
Need to get 18.9 MB of archives.
After this operation, 103 MB of additional disk space will be used.
Do you want to continue? [Y/n]

10. STOP CONTAINER

실행중인 Container 를 정지하기 위해 docker stop 명령어를 사용한다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f3ca7c49d662        ubuntu              "/bin/bash"         About an hour ago   Up 32 minutes                           test

$ docker stop test
test

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker stop <Container Name | ID> 형식을 사용하며 실행중인 Container 리스트를 확인하면 비어있는 리스트를 확인할 수 있다.

11. REMOVE CONTAINER

생성된 Container 를 삭제하기 위해서 docker rm 명령어를 사용한다.

$ docker rm test
test

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS               NAMES

docker rm <Container Name | ID> 형식으로 docker ps -a 명령어로 확인하면 아무것도 없는 것을 확인할 수 있다.

12. REMOVE IMAGE

Container 의 image 삭제는 docker rmi 명령어를 사용한다.

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              ccc6e87d482b        5 weeks ago         64.2MB

$ docker rmi ubuntu:latest
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:8d31dad0c58f552e890d68bbfb735588b6b820a46e459672d96e585871acc110
Deleted: sha256:ccc6e87d482b79dd1645affd958479139486e47191dfe7a997c862d89cd8b4c0
Deleted: sha256:d1b7fedd4314279a7c28d01177ff56bcff65300f6d41655394bf5d8b788567f6
Deleted: sha256:340bed96497252624f5e4b0f42accfe7edbb7a01047e2bb5a8142b2464008e73
Deleted: sha256:6357c335cdfcc3a120e288bbd203bf4c861a14245ce5094634ee097e5217085b
Deleted: sha256:43c67172d1d182ca5460fc962f8f053f33028e0a3a1d423e05d91b532429e73d

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker rmi <Image Name | ID>:<TAG> 형식으로 구성되며 docker images 명령어로 확인하면 image 가 없는 것을 확인할 수 있다.

docker rmi <Image Name> 과 같이 ‘image Name’ 만 지정하는 경우 TAG 에 상관없이 같은 이름을 모두 삭제한다.