Docker는 Docker Engine 위에서 독립된 운영 환경을 동작 시킬수 있는 도구 입니다.
개발 환경 구축 또는 배포 환경을 구축을 하게 되면 필연적으로 OS를 설치하고 관련된 툴들을 설치하게 됩니다. 서버가 여러대가 되거나, 테스트를 반복하게 되면 이러한 일들도 반복 작업이 되어 오래 걸리는데, 가상머신을 이용해서 줄일 수도 있습니다.
VMware, VirtualBox 등의 가상머신 환경은 환경을 구축해 놓으면 반복해서 사용할수 있고 유용한 점이 많지만 이미지를 많드는데 들어가는 노력도 크고 이미지 사이즈도 큰 편입니다.
Docker는 운영체제 부분을 호스트 머신을 그대로 사용하므로서, 하나의 서버에 여러 운영체제를 설치해도 낭비되는 부분이 없이 빠른 설치가 가능하고, Docker Hub 라는 사이트를 통해서 다른 사람들이 작성해놓은 설정을 그대로 가져다 쓸수 있습니다.
예를 들여, 워드프레스로 구동되는 웹서버를 구축하려면 기존에는 운영체제를 설치하고 LAMP ( Linux, Apache, MySQL, PHP ) 툴을 설치하는 과정을 거쳐야 했지만, 구동되는 리눅스 서버가 있다면, Docker 를 설치하고 워드프레스에서 제공되는 Docker Image ( https://hub.docker.com/_/wordpress ) 를 설치하면 됩니다.
본 문서에서는 MacOS 기준으로만 다룹니다. Docker Engine 의 경우 MacOS 뿐만 아니라, Linux, Windows 에도 설치가 가능합니다.
MacOS 의 경우 https://hub.docker.com/ 에서 설치 파일을 받아서 쉽게 설치 할수 있습니다.
Drag and Drop 으로 설치합니다.
설치가 완료되면 실행되는 창에서 로그인을 합니다.
❯ docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:22:34 2019
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
Git commit: 633a0ea
Built: Wed Nov 13 07:29:19 2019
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.10
GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339
runc:
Version: 1.0.0-rc8+dev
GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657
docker-init:
Version: 0.18.0
GitCommit: fec3683
터미널 창에서 docker 명령어를 통해서 docker 를 사용할 수 있습니다. docker version 명령을 사용하면 버전을 확인 할 수 있습니다.
docker 컨테이너를 다운로드합니다.
❯ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
2746a4a261c9: Pull complete
4c1d20cdee96: Pull complete
0d3160e1d0de: Pull complete
c8e37668deea: Pull complete
Digest: sha256:250cc6f3f3ffc5cdaa9d8f4946ac79821aafb4d3afc93928f0de9336eba21aa4
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
```
가장 마지막 버전의 ubuntu 컨테이너를 다운로드
```
❯ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
3386e6af03b0: Pull complete
49ac0bbe6c8e: Pull complete
d1983a67e104: Pull complete
1a0f3a523f04: Pull complete
Digest: sha256:181800dada370557133a502977d0e3f7abda0c25b9bbb035f199f5eb6082a114
Status: Downloaded newer image for ubuntu:16.04
docker.io/library/ubuntu:16.04
```
ubuntu 16.04 버전을 다운로드
#### docker images
다운로드 되어 보관중인 images 를 확인합니다.
```
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 c6a43cd4801e 10 days ago 123MB
ubuntu 18.04 549b9b86cb8d 10 days ago 64.2MB
ubuntu latest 549b9b86cb8d 10 days ago 64.2MB
```
#### docker rmi
보관중인 images 를 삭제합니다.
```
❯ docker rmi c6a43cd4801e
Untagged: ubuntu:16.04
Untagged: ubuntu@sha256:181800dada370557133a502977d0e3f7abda0c25b9bbb035f199f5eb6082a114
Deleted: sha256:c6a43cd4801e1cf8832aa1dcda0df1f3730eea7e805be27b24cff32b007a919e
Deleted: sha256:7cdf8968022e5ad1324543c5d43db8442cb4b6371393d1749875a680ff61c0f3
Deleted: sha256:a2427c33a3d31bc0eb341b83f535db40e0a87692cdc16a94e3f538f21b90f345
Deleted: sha256:631b71568d5b1b433e4395f6f748d9095794975743ab17d1fb927e8a21914302
Deleted: sha256:91d23cf5425acce8ca4402d83139cec63a5547d1a704af63478df008f9b2e4e0
~
❯ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 549b9b86cb8d 10 days ago 64.2MB
ubuntu latest 549b9b86cb8d 10 days ago 64.2MB
```
삭제할 image ID 는 동일한 내용이 없는 경우 앞자리 중 일부만 입력해도 동작합니다.
docker rmi c6a43cd4801e 대신 docker rmi c6 를 입력하여도 동일한 결과.
## 컨터이너 실행하기
#### docker run
```
❯ docker run -i -t --name ubuntu ubuntu:18.04 /bin/bash
root@6a101c7494f3:/# cat /etc/issue
Ubuntu 18.04.3 LTS \n \l
root@6a101c7494f3:/# exit
exit
```
ubuntu 18.04 이미지를 ubuntu 이름으로 실행하고 화면을 Bash Shell 으로 지정합니다.
exit 명령 또는 Ctrl+D 으로 빠져 나올 수 있습니다.
#### docker ps
실행중인 컨테이너 목록을 확인합니다.
```
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a101c7494f3 ubuntu:18.04 "/bin/bash" 2 minutes ago Exited (130) 39 seconds ago ubuntu
```
ps 명령을 통해서 실행중인 docker 의 상태를 확인할수 있습니다.
exit 명령 또는 Ctrl+D 키로 빠져나온 docker 는 중지 상태에 놓이게 됩니다.
```
❯ docker run -i -t --name ubuntu2 ubuntu:18.04 /bin/bash
root@2e2391d6c217:/#
~ 15s
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e2391d6c217 ubuntu:18.04 "/bin/bash" 20 seconds ago Up 19 seconds ubuntu2
6a101c7494f3 ubuntu:18.04 "/bin/bash" 4 minutes ago Exited (130) 2 minutes ago ubuntu
```
Ctrl+P, Ctrl+Q 를 입력하면 실행상태를 유지한채로 호스트 PC 의 터미널로 빠져 나올수 있습니다.
#### docker rm
```
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e2391d6c217 ubuntu:18.04 "/bin/bash" 20 seconds ago Up 19 seconds ubuntu2
6a101c7494f3 ubuntu:18.04 "/bin/bash" 4 minutes ago Exited (130) 2 minutes ago ubuntu
~
❯ docker rm 6a101c7494f3
6a101c7494f3
~
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e2391d6c217 ubuntu:18.04
```
불필요한 컨테이너를 삭제합니다.
CONTAINER ID 대신 생성시 지정한 이름으로도 삭제할 수 있습니다.
#### docker exec
실행중인 docker에 명령을 실행합니다. ( shell 연결등 )
```
❯ docker exec -it ubuntu /bin/bash
root@7087924b06eb:/#
```
ubuntu 이름으로 되어있는 컨테이너를 bash shell 로 연결하여 접속합니다.
#### docker start
중지 상태인 컨테이너를 실행합니다.
#### docker stop
실행 상태인 컨테이너를 중지합니다.
```
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f951153a64be ubuntu:18.04 "/bin/bash" 13 seconds ago Exited (0) 3 seconds ago ubuntu
❯ docker start ubuntu
ubuntu
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f951153a64be ubuntu:18.04 "/bin/bash" 32 seconds ago Up 3 seconds ubuntu
❯ docker stop ubuntu
ubuntu
❯ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f951153a64be ubuntu:18.04 "/bin/bash" 41 seconds ago Exited (0) 2 seconds ago ubuntu
```