본문 바로가기
Container/Docker

간단한 Docker 실습

by wrynn 2021. 11. 3.

실습환경

 실습환경은 Ubuntu 20.04 AMI를 사용한 AWS EC2를 사용하였습니다.

$ uname -a
Linux ip-172-00-00-00 5.11.0-1020-aws #21~20.04.2-Ubuntu SMP Fri Oct 1 13:03:59 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ whoami
ubuntu
$ pwd
/home/ubuntu

설치

1. docker 설치

$ sudo apt-get update
$ sudo apt install docker.io

 

2. ubuntu 계정에 docker 바이너리 실행 권한 부여

$ sudo groupadd docker
$ sudo usermod -aG docker ubuntu

 

3. docker version 명령으로 정상 설치 여부 확인하기

 docker 바이너리 파일을 사용하여 docker daemon과 통신할 수 있습니다.

$ docker version
Client: Docker Engine - Community
 Version:           20.10.17
 API version:       1.41
 Go version:        go1.17.11
 Git commit:        100c701
 Built:             Mon Jun  6 23:02:46 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.17
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.17.11
  Git commit:       a89b842
  Built:            Mon Jun  6 23:00:51 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.6
  GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
 runc:
  Version:          1.1.2
  GitCommit:        v1.1.2-0-ga916309
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

 docker daemon 프로세스가 실행 중임을 확인할 수 있습니다.

$ ps -ef | grep dockerd
root        2366       1  0 15:27 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ubuntu      3198    3172  0 15:33 pts/0    00:00:00 grep --color=auto dockerd

컨테이너 생성 및 접속

1. Dockerfile 작성

 Dockerfile을 빌드하면 이미지를 얻게 되며, 이미지는 컨테이너를 생성하는데 사용됩니다. Dockerfile에는 컨테이너가 어떤 OS를 사용할 지, 어떤 명령을 수행할 지, 어떤 파일이 컨테이너안에 배치될지 등을 서술합니다. 

$ echo hello docker >> test.txt
$ vi Dockerfile.txt
FROM centos:7

COPY test.txt.

CMD while true; do cat test.txt; sleep 5; done;

 

2. Dockerfile 빌드

 docker build 명령을 통해 Dockerfile에서 이미지를 생성합니다. 

$ docker build -t gildonghong/hello-world:1.0 .

# gildonghong : 사용자 이름
# hello-world : 이미지 이름
# 1.0 : 버전

 

 정상적으로 빌드하고 난 후, image가 2개 생성된 것을 확인할 수 있습니다. docker는 저장공간을 효율적으로 사용하고 빌드 시간을 줄이기 위해 레이어를 사용하여 이미지를 계층적으로 관리하기 때문에 2개의 이미지가 생성됩니다. (centos 및 gildonghong/hello-world)

$ docker images
REPOSITORY                TAG       IMAGE ID       CREATED         SIZE
gildonghong/hello-world   1.0       63913f965c08   2 minutes ago   204MB
centos                    7         eeb6ee3f44bd   7 weeks ago     204MB

 

3. 빌드한 이미지로 컨테이너 실행하기

 docker run 명령으로 컨테이너를 생성 후 실행합니다. 해당 컨테이너는 hello docker 라는 문장을 5초마다 한번씩 출력합니다.

$ docker run gildonghong/hello-world:1.0
hello docker
hello docker
...

 

4. 실행 중인 컨테이너에 접속하기

 터미널을 하나 더 실행시킨 후, 이전 단계에서 실행한 컨테이너에 접속해봅시다. 먼저 docker ps 명령을 통해 CONTAINER ID를 확인합니다.

$ docker ps
CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS     NAMES
3dac98cb389e   gildonghong/hello-world:1.0   "/bin/sh -c 'while t…"   35 seconds ago   Up 34 seconds             gracious_wu

 

 확인한 ID를 바탕으로 docker exec 명령을 통해 컨테이너에 실행 중인 컨테이너로 들어가봅시다. exec 명령을 수행할 때에는 CONTAINER ID를 전부 작성하지 않아도 해당 값으로 서로 다른 컨테이너가 구분만 되면 동작합니다. 아래와 같이 3da 까지만 전달해도 특정 컨테이너를 식별하여 접속이 가능한 것을 확인할 수 있습니다. 

$ docker exec -it 3da bash
$ ls
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test.txt  tmp  usr  var

 

 컨테이너 내부에서 test.txt 파일의 내용을 변경해봅시다.

$ echo hello container >> test.txt

 

 그 다음 hello docker를 출력중이던 터미널을 확인해보면 출력 내용이 아래와 같이 바뀐 것을 확인할 수 있습니다.

hello docker
hello docker
hello container
hello container
...

테스트 컨테이너 삭제

 컨테이너를 제거하기 위해 다시 컨테이너에 접속해 있던 터미널로 이동해서, exit 으로 컨테이너에서 빠져나옵니다. 그 다음 호스트에서 docker stop 명령으로 실행중인 컨테이너를 중지하고, docker rm 명령으로 컨테이너를 제거합니다.

$ exit
$ docker stop 3da
$ docker rm -f 3da

 

 실습 시 다운로드한 이미지를 삭제하기 위해 docker rmi 명령을 사용할 수 있습니다.

$ docker rmi -f entos:7 gildonghong/hello-world:1.0

댓글