실행 환경

  • 저번에 깔았던 VM

  • 도커는 설치나 실행시 기본적으로 슈퍼유저 권한이 필요한데(root / sudo)
    셋팅이 번거로우니까 root로 실행함
    단, 블로그에서는 하이라이팅을 위해 (#은 주석처리되서..) $로 표기함


yum(패키지 관리)으로 Docker 설치하기

  • yum으로 설치시 필요한 디펜던시도 같이 설치해줘서 편함
$ yum install -y docker

(중략)

Installed:
  docker.x86_64 2:1.13.1-103.git7f2769b.el7.centos

Dependency Installed:
  PyYAML.x86_64 0:3.10-11.el7
  atomic-registries.x86_64 1:1.22.1-29.gitb507039.el7
  audit-libs-python.x86_64 0:2.8.5-4.el7
  checkpolicy.x86_64 0:2.5-8.el7
  container-selinux.noarch 2:2.107-3.el7
  container-storage-setup.noarch 0:0.11.0-2.git5eaf76c.el7
  containers-common.x86_64 1:0.1.37-3.el7.centos
  docker-client.x86_64 2:1.13.1-103.git7f2769b.el7.centos
  docker-common.x86_64 2:1.13.1-103.git7f2769b.el7.centos
  libcgroup.x86_64 0:0.41-21.el7
  libsemanage-python.x86_64 0:2.5-14.el7
  libyaml.x86_64 0:0.1.4-11.el7_0
  oci-register-machine.x86_64 1:0-6.git2b44233.el7
  oci-systemd-hook.x86_64 1:0.2.0-1.git05e6923.el7_6
  oci-umount.x86_64 2:2.5-3.el7
  policycoreutils-python.x86_64 0:2.5-33.el7
  python-IPy.noarch 0:0.75-6.el7
  python-backports.x86_64 0:1.0-8.el7
  python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7
  python-ipaddress.noarch 0:1.0.16-2.el7
  python-pytoml.noarch 0:0.1.14-1.git7dea353.el7
  python-setuptools.noarch 0:0.9.8-7.el7
  setools-libs.x86_64 0:3.3.8-4.el7
  subscription-manager-rhsm-certificates.x86_64 0:1.24.13-3.el7.centos
  yajl.x86_64 0:2.0.4-4.el7



도커 실행하기

$ sudo systemctl start docker
$ ps -ef | grep docker
root     23419     1  3 12:43 ?        00:00:00 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
root     23424 23419  0 12:43 ?        00:00:00 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true



도커 이미지 찾기

  • 이미지 찾는 명령어
docker search [이미지명]
  • Docker Hub에서도 확인할 수 있음 LINK

  • CentOS 이미지를 찾아보자

$ docker search centos
INDEX       NAME                                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/centos                             The official build of CentOS.                   5617      [OK]
docker.io   docker.io/ansible/centos7-ansible            Ansible on Centos7                              124                  [OK]
docker.io   docker.io/jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos ...   114                  [OK]
docker.io   docker.io/consol/centos-xfce-vnc             Centos container with "headless" VNC sessi...   99                   [OK]
docker.io   docker.io/centos/mysql-57-centos7            MySQL 5.7 SQL database server                   63
docker.io   docker.io/imagine10255/centos6-lnmp-php56    centos6-lnmp-php56                              57                   [OK]
docker.io   docker.io/tutum/centos                       Simple CentOS docker image with SSH access      44
docker.io   docker.io/centos/postgresql-96-centos7       PostgreSQL is an advanced Object-Relationa...   39
docker.io   docker.io/kinogmt/centos-ssh                 CentOS with SSH                                 29                   [OK]
docker.io   docker.io/centos/php-56-centos7              Platform for building and running PHP 5.6 ...   22
docker.io   docker.io/pivotaldata/centos-gpdb-dev        CentOS image for GPDB development. Tag nam...   10
docker.io   docker.io/nathonfowlie/centos-jre            Latest CentOS image with the JRE pre-insta...   8                    [OK]
docker.io   docker.io/drecom/centos-ruby                 centos ruby                                     6                    [OK]
docker.io   docker.io/centos/tools                       Docker image that has systems administrati...   4                    [OK]
docker.io   docker.io/darksheer/centos                   Base Centos Image -- Updated hourly             3                    [OK]
docker.io   docker.io/mamohr/centos-java                 Oracle Java 8 Docker image based on Centos 7    3                    [OK]
docker.io   docker.io/pivotaldata/centos                 Base centos, freshened up a little with a ...   3
docker.io   docker.io/pivotaldata/centos-gcc-toolchain   CentOS with a toolchain, but unaffiliated ...   2
docker.io   docker.io/pivotaldata/centos-mingw           Using the mingw toolchain to cross-compile...   2
docker.io   docker.io/blacklabelops/centos               CentOS Base Image! Built and Updates Daily!     1                    [OK]
docker.io   docker.io/indigo/centos-maven                Vanilla CentOS 7 with Oracle Java Developm...   1                    [OK]
docker.io   docker.io/mcnaughton/centos-base             centos base image                               1                    [OK]
docker.io   docker.io/pivotaldata/centos6.8-dev          CentosOS 6.8 image for GPDB development         0
docker.io   docker.io/pivotaldata/centos7-dev            CentosOS 7 image for GPDB development           0
docker.io   docker.io/smartentry/centos                  centos with smartentry                          0                    [OK]



도커 이미지 Pull (받기)

  • 이미지명:태그

    • 공식 이미지는 이미지명에 사용자명이 붙지 않음

    • 제일 마지막 Update본은 태그 latest

  • docker.io/centos의 최신 이미지를 받아보자

    • centos:latest
docker pull centos:latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for docker.io/centos:latest



도커 이미지 확인하기

  • 명령어 docker images로 pull받아온 이미지들을 확인할 수 있음
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              0f3e07c0138f        2 weeks ago         220 MB



도커 이미지를 컨테이너로 띄우기

  • 명령어 docker run으로 가지고 있는 이미지를 컨테이너화 할 수 있음

    • 서버를 띄운다는 개념으로 보면 될 것 같음

    • docker run <옵션...> <이미지명> <실행할 파일="">

  • 옵션은 상당히 많기 때문에 나중에 정리할 예정

  • 이번에 쓸 옵션

    • -i : interactive; interactive한 흐름을 만들어줌(출력을 사용자에게 보여줌)

    • -t : Pseudo-tty; TTY(터미널)을 사용자가 이용할 수 있게 해줌

    • --name [name] : 컨테이너 이름 지정(지정 안할 경우 Docker가 Default 자동 이름 생성함)

    • /bin/bash : 컨테이너 생성 후 /bin/bash를 실행하여 배쉬 쉘을 이용할 수 있게 해줌

$ docker run -i -t --name hello centos /bin/bash

### 컨테이너에 접속됨
[root@265fa2e0199e /]$
[root@265fa2e0199e /]$ ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

### 컨테이너에서 빠져나옴
[root@265fa2e0199e /]$ exit
exit



도커 컨테이너 확인

  • 명령어 docker ps로 확인

    • docker ps <옵션...>
  • 이번에 쓸 옵션

    • ‘-a’ : 정지된 컨테이너까지 모두 확인시켜줌
### 그냥 조회시 보이지 않음
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

### 아까 컨테이너에서 빠져나왔기 때문에 정지된 컨테이너이기 때문
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
265fa2e0199e        centos              "/bin/bash"         5 minutes ago       Exited (0) About a minute ago                       hello



정지된 컨테이너 다시 띄우기

  • 정지된 컨테이너를 다시 띄울 땐 docker start로 띄움

    • docker start <컨테이너명>

    • docker start <컨테이너ID>

  • 유의) 띄우면 바로 컨테이너로 인입하지 않음

### 컨테이너명으로 띄우던 ID로 띄우던 동일. 택 1
$ docker start hello # 컨테이너명
hello

$ docker start 265fa2e0199e # 컨테이너ID
265fa2e0199e

### 띄워졌는지는 docker ps로 확인
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
265fa2e0199e        centos              "/bin/bash"         10 minutes ago      Up 56 seconds                           hello



띄워진 컨테이너 재시작하기

  • 띄워진 컨테이너를 다시 띄울 땐(재시작) docker restart

    • docker start <컨테이너명>

    • docker start <컨테이너ID>

### 컨테이너명으로 재시작하던 ID로 재시작하던 동일. 택 1
$ docker restart hello # 컨테이너명
hello

$ docker restart 265fa2e0199e # 컨테이너ID
265fa2e0199e

### 띄워졌는지는 docker ps로 확인(STATUS 시간 갱신 확인)
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
265fa2e0199e        centos              "/bin/bash"         12 minutes ago      Up 1 second                             hello



띄워진 컨테이너에 인입(접속)

  • 띄워진 컨테이너에 접속하기(처음 만들 때 처럼)

    • docker init <컨테이너명>

    • docker init <컨테이너ID>

$ docker attach hello
[root@265fa2e0199e /]$ ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var



접속한 컨테이너 정지하지 않고 빠져나오기

  • 컨테이너 정지하고 빠져나오기

    • exit 명령어 입력

    • Ctrl + d

### exit 명령어 입력
[root@265fa2e0199e /]$ exit
exit

### Ctrl + d
[root@265fa2e0199e /]# exit

### Docker ps시 컨테이너가 정지됨을 확인할 수 있음
[root@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
  • 컨테이너 정지하지 않고 빠져나오기

    • 차례로) Ctrl + p, Ctrl + q
### Docker ps시 컨테이너가 떠있는 것을 확인할 수 있음
[root@265fa2e0199e /]$ [root@localhost ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
265fa2e0199e        centos              "/bin/bash"         17 minutes ago      Up About a minute                       hello



컨테이너에 인입하지 않고 명령어 보내기

  • 실행중인 컨테이너에 docker exec 사용시, 외부에서 컨테이너 안의 명령을 실행할 수 있음

    • docker exec <컨테이너명> <명령> <매개 변수="">

    • docker exec <컨테이너ID> <명령> <매개 변수="">

  • 주로 실행된 컨테이너에 yum으로 패키지를 추가 설치하거나, 각종 데몬들을 실행할 때 사용됨

### 현재 서버에서 ls 명령을 보낼 때
$ ls
anaconda-ks.cfg

### 컨테이너에 ls 명령을 보냄 (컨테이너명 이용)
$ docker exec hello ls
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

### 컨테이너에 ls -l 명령을 보냄 (컨테이너ID 이용)
$ docker exec 265fa2e0199e ls -l
total 0
lrwxrwxrwx.   1 root root   7 May 11 00:33 bin -> usr/bin
drwxr-xr-x.   5 root root 360 Oct 16 04:17 dev
drwxr-xr-x.   1 root root  66 Oct 16 04:01 etc
drwxr-xr-x.   2 root root   6 May 11 00:33 home
lrwxrwxrwx.   1 root root   7 May 11 00:33 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11 00:33 lib64 -> usr/lib64
drwx------.   2 root root   6 Sep 27 17:13 lost+found
drwxr-xr-x.   2 root root   6 May 11 00:33 media
drwxr-xr-x.   2 root root   6 May 11 00:33 mnt
drwxr-xr-x.   2 root root   6 May 11 00:33 opt
dr-xr-xr-x. 118 root root   0 Oct 16 04:17 proc
dr-xr-x---.   1 root root  27 Oct 16 04:05 root
drwxr-xr-x.   1 root root  21 Oct 16 04:01 run
lrwxrwxrwx.   1 root root   8 May 11 00:33 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11 00:33 srv
dr-xr-xr-x.  13 root root   0 Oct 15 01:03 sys
drwxrwxrwt.   7 root root 145 Sep 27 17:13 tmp
drwxr-xr-x.  12 root root 144 Sep 27 17:13 usr
drwxr-xr-x.  20 root root 262 Sep 27 17:13 var



컨테이너 정지하기

  • docker stop으로 실행중인 컨테이너 정지

    • 인입해서 exit하는 것과 같은 효과

    • docker stop <컨테이너명>

    • docker stop <컨테이너ID>

### 컨테이너 떠있는 것 확인
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
265fa2e0199e        centos              "/bin/bash"         26 minutes ago      Up 10 minutes                           hello

### 컨테이너 정지명령 (아래 명령 둘 동일)
$ docker stop hello # 컨테이너명
hello

$ docker stop 265fa2e0199e # 컨테이너 ID
265fa2e0199e


### 컨테이너 정지
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
265fa2e0199e        centos              "/bin/bash"         27 minutes ago      Exited (0) About a minute ago                       hello



생성된 컨테이너 삭제

  • 생성된 컨테이너를 삭제

    • docker rm <컨테이너명>

    • docker rm <컨테이너ID>

  • 단, 컨테이너는 정지된 상태여야 함

### 정지된 컨테이너 확인
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
265fa2e0199e        centos              "/bin/bash"         32 minutes ago      Exited (0) 6 minutes ago                       hello

### 정지된 컨테이너 삭제 (아래 명령 둘 동일)
$ docker rm hello
hello

$ docker rm 265fa2e0199e
265fa2e0199e

### 삭제 확인
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

### 만약 컨테이너가 정지된 상태가 아니었다면?(다시 띄워보고 테스트) - 에러 발생
$ docker run -it --name hello centos

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
da3bfea15220        centos              "/bin/bash"         8 seconds ago       Up 7 seconds                            hello

$  docker rm hello
Error response from daemon: You cannot remove a running container da3bfea15220622e49e0907b8e22102b77b54d622fd5b32049f0a6df031f9972. Stop the container before attempting removal or use -f



생성된 이미지 삭제

  • 생성된(혹은 다운(pull)받았던) 이미지 삭제

    • docker rmi <이미지명>:<태그> → 이미지명 & 태그가 모두 일치하는 이미지가 삭제

    • docker rmi <이미지명> → 이미지명이 동일한 모든 이미지가 삭제(태그 구분 X)

    latest 버전만 삭제되는 것 같기도 함

  • 단, 이미지를 통해 생성된 컨테이너가 모두 없어야 함

### 컨테이너 없음 확인
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

### 이미지 확인
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              0f3e07c0138f        2 weeks ago         220 MB

### 이미지명과 태그를 조합하여 삭제
$ docker rmi centos:latest
Untagged: centos:latest
Untagged: docker.io/centos@sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Deleted: sha256:0f3e07c0138fbe05abcb7a9cc7d63d9bd4c980c3f61fea5efa32e7c4217ef4da
Deleted: sha256:9e607bb861a7d58bece26dd2c02874beedd6a097c1b6eca5255d5eb0d2236983

### 이미지 확인
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

### 만약에 컨테이너가 존재한다면(정지여부 상관 없음)? - 에러 발생
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
da3bfea15220        centos              "/bin/bash"         8 seconds ago       Up 7 seconds                            hello

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
da3bfea15220        centos              "/bin/bash"         About a minute ago   Exited (0) 19 seconds ago                       hello

$ docker rmi centos
Error response from daemon: conflict: unable to remove repository reference "centos" (must force) - container da3bfea15220 is using its referenced image 0f3e07c0138f



이미지 생성은 다음 시간에 :)