docker를 사용해보자 (docker 기본 명령어 사용해보기)
이번 시간에는 이전에 배운 개념을 토대로 docker 를 직접 사용해 봅시다.
💡 목차
이번 시간에 학습할 부분은 아래와 같다. 전체적으로 무엇을 배울지 미리 확인하고 가자.
- 도커 다운로드
-
도커 설치 확인 (docker version)
- docker version 명령어에 대한 의미를 살펴 보자.
-
docker 이미지 다루기 - 자주 사용 하는 명령어 정리
- docker 이미지를 다루는 명령어를 살펴 봅니다.
-
docker 컨테이너 다루기 - 자주 사용 하는 명령어 정리
- docker 컨테이너를 다루는 명령어를 살펴 봅니다.
-
docker 실습
- docker 명령어를 직접 사용해 봅시다.
-
docker 기타 명령어 정리
- 그 외 기다 명령어를 살펴 봅니다.
1. 도커 다운로드
아래 주소를 통해 도커를 다운로드 해보자.
- 맥 : https://docs.docker.com/docker-for-mac/
- 윈도우: https://docs.docker.com/docker-for-windows/
- 리눅스: https://docs.docker.com/install/linux/docker-ce/centos/
🔹 docker 설치 for centos7
centos7 에 docker 를 설치하는 방법입니다.
# yum-config-manager 쓸 수 있도록 설치
$ sudo yum -y install yum-utils
# 도커 repository 추가
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 최신 도커 설치
$ sudo yum -y install docker-ce
# docker를 root 계정이 아닌 현재 계정으로도 사용하기 위해 docker 그룹에 현재 계정도 추가한다.
$ sudo usermod -aG docker $(whoami)
# reboot 시 도커 자동으로 재 실행 되도록 설정
$ sudo systemctl enable docker.service
# 도커 서비스 시작
$ sudo systemctl start docker.service
2. 도커 설치 확인 (docker version)
아래 명령어는 mac 에서 진행한 결과 입니다.
🔹 docker version
$ docker version
설치 완료 후 도커가 정상적으로 동작하는지 해당 명령어를 입력합니다.🔹 docker version 결과
이전에 설명한 Docker architecture 에서 도커의 구조는 클라이언트-서버 가 존재한다고 하였습니다. 여기 결과에 Client/Server가 존재하는 이유도 이와 같습니다. 이 명령어 결과의 의미는 다시 정리해보면 아래와 같습니다.
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: true
도커 문서 참조 - docker Client-Server 구조
- client: 현재 나의 컴퓨터. OS/Arch 를 보면 제 컴퓨터가 mac이라서 darwin/amd64 라고 확인할 수 있습니다.
- server: 실제 컨테이너를 생성 및 실행하며 이미지를 관리합니다. Client가 명령어를 전달하면 Server가 명령어를 받아 실행합니다.
3. docker 이미지 다루기 - 자주 사용 하는 명령어 정리
🔹 docker search
$ docker search [검색할 이미지명]
docker hub에 존재하는 이미지 리스트를 확인할 수 있다.🔸 예시
$ docker search ubuntu
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
ubuntu Ubuntu is a Debian-based Linux operating sys… 10605 [OK]
dorowu/ubuntu-desktop-lxde-vnc Docker image to provide HTML5 VNC interface … 404 [OK]
rastasheep/ubuntu-sshd Dockerized SSH service, built on top of offi… 243 [OK]
consol/ubuntu-xfce-vnc Ubuntu container with "headless" VNC session… 211 [OK]
ubuntu-upstart Upstart is an event-based replacement for th… 106 [OK]
ansible/ubuntu14.04-ansible Ubuntu 14.04 LTS with ansible 98 [OK]
neurodebian NeuroDebian provides neuroscience research s… 67 [OK]
🔹 docker pull
$ docker pull [저장소 이름]/[이미지 이름]:[태그]
이미지를 다운로드를 한다.키 | 의미 |
---|---|
저장소 이름 | 이미지가 저장된 장소. 없는 경우는 기본 이미지로 도커 허브의 공식 이미지 |
이미지 이름 | 다운 받을 이미지 이름. 예를 들어 ubuntu, nginx |
태그 | 이미지 관리 버전. 일반적으로 18.04와 같은 버전을 명시. 태그 생략 시 latest 의미. |
🔸 예시
- ubuntu 라는 이미지 이름. 태그는 18.04 의 이미지를 다운로드 한다.
- 저장소: 도커 허브에 존재. 도커허브사이트 에서 확인 가능
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
🔹 docker images
$ docker images
이미지 목록 확인하기🔸 예시
- 이전 예제에서 다운받은 이미지 리스트를 확인할 수 있다.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 72300a873c2c 2 weeks ago 64.2MB
🔹 docker rmi
$ docker rmi 이미지1 [이미지2, 이미지3 ...]
이미지 제거하기🔸 예시
- 다운 받았던 이미지를 삭제하고, 다시 ‘docker images’ 명령어로 목록을 확인하자
- 제거 방식은 docker rmi [도커이름:태그] 또는 [image id]
$ docker rmi ubuntu:18.04
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Deleted: sha256:72300a873c2ca11c70d0c8642177ce76ff69ae04d61a5813ef58d40ff66e3e7c
Deleted: sha256:d3991ad41f89923dac46b632e2b9869067e94fcdffa3ef56cd2d35b26dd9bce7
Deleted: sha256:2e533c5c9cc8936671e2012d79fc6ec6a3c8ed432aa81164289056c71ed5f539
Deleted: sha256:282c79e973cf51d330b99d2a90e6d25863388f66b1433ae5163ded929ea7e64b
Deleted: sha256:cc4590d6a7187ce8879dd8ea931ffaa18bc52a1c1df702c9d538b2f0c927709d
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
4. docker 컨테이너 다루기 - 자주 사용 하는 명령어 정리
🔹 docker run
$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)를 한 후 컨테이너를 생성(create)하고 시작(start)한다.🔸 OPTIONS
옵션 | 의미 |
---|---|
-d | detached mode로 백그라운드 모드 |
-p | 호스트와 컨테이너의 포트를 연결 (포워딩) |
-v | 호스트와 컨테이너의 디렉토리를 연결 (마운트) |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
—name | 컨테이너 이름 설정 |
-it | -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션 |
—rm | 프로세스 종료시 컨테이너 자동 제거 |
—link | 컨테이너 연결 [컨테이너 명:별칭] |
🔸 예시 1
- ubuntu:18.04 컨테이너를 실행하는 예시로 해당 이미지가 없어서 다운로드(pull)한 뒤, 컨테이너를 실행한다.
$ docker run ubuntu:18.04
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
423ae2b273f4: Pull complete
de83a2304fa1: Pull complete
f9a83bce3af0: Pull complete
b6b53be908de: Pull complete
Digest: sha256:04d48df82c938587820d7b6006f5071dbbffceb7ca01d2814f81857c631d44df
Status: Downloaded newer image for ubuntu:18.04
🔸 예시 2
- - - name: test라는 컨테이너 이름 설정
- -it: 컨테이너 내부로 들어가 bash 입력이 가능
- - - rm: 프로세스 종료되면 자동으로 도커 컨테이너 종료
$ docker run --name test -it --rm ubuntu:18.04
# 아래는 docker bash 들어간 것**
root@de78d86be9c0:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
🔹 docker ps
$ docker ps [OPTIONS]
컨테이너 목록 확인. 옵션 없이 사용하는 경우 실행중인 컨테이너만 출력.🔸 OPTIONS
옵션 | 의미 |
---|---|
–all , -a | 모든 컨테이너를 보여준다. (컨테이너가 실행중이지 않는 것이라도, stop된 컨테이너도 보여줌 ) |
🔸 예시
- STATUS 를 통해 컨테이너의 상태를 확인 가능.
- Exited: 정지된 상태 , UP: 실행 중인 상태
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd532bf89bbb ubuntu:18.04 "/bin/bash" 4 minutes ago Exited (0) 4 minutes ago test
🔹 docker rm
$ docker rm [OPTIONS] 컨테이너1 [컨테이너2...]
컨테이너를 제거🔸 OPTIONS
옵션 | 의미 |
---|---|
–force , -f | 실행중인 컨테이너를 강제로 제거한다. (uses SIGKILL) |
🔸 예시
$ docker rm -f test
🔹 docker start
$ docker start [OPTIONS] 컨테이너1 [컨테이너2...]
stop된 컨테이너를 실행하기🔹 docker stop
$ docker stop [OPTIONS] 컨테이너1 [컨테이너2...]
실행 중인 컨테이너를 stop 하기🔹 docker logs
$ docker logs [OPTIONS] CONTAINER
도커 컨테이너의 로그 확인하기🔸 OPTIONS
옵션 | 의미 |
---|---|
–follow , -f | 실시간 로그 생성 |
–tail | 마지막 number 숫자 줄 만큼만 출력 |
🔸 예시
$ docker logs -f <컨테이너 명>
🔹 docker exec
$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
실행 중인 컨테이너에 들어갈 때 사용🔸 예시
$ docker exec -it <컨테이너 명> /bin/bash
5. docker 실습
🔹 컨테이너 외부 노출하기 (run -p 사용) - nginx
nginx 를 띄워서 확인해보자
- -p 옵션 : -p [호스트 포트]:[컨테이너 포트]
$ docker run --name nginx-server -d -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
68ced04f60ab: Pull complete
28252775b295: Pull complete
a616aa3b0bf2: Pull complete
Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest
87781528d23655be1c12feb6a1f54a63f8e41696a370512e41462cd210288114
- localhost:8080 접속하기
🔹 워드프레스 + mysql
🔸 mysql 컨테이너 생성
- 환경 설정 확인 : mysql docker hub site
$ docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
🔸 워드프레스 컨테이너 생성
- 환경 설정 확인: wordpress docker hub site
- -p 80: 호스트의 포트 하나와 컨테이너 80 포트 연결
- —link: 다른 컨테이너 ip 대신 별명으로 접근하도록 설정. [컨테이너 명]:[호스트 별칭]
$ docker run -d \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress
🔸 사이트 접속
- wordpress 호스트포트는 지정을 안해줘 자동으로 설정되었다. docker ps 명령어로 포트를 확인하자!
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
699c2553b0c6 wordpress "docker-entrypoint.s…" 11 minutes ago Up 10 minutes 0.0.0.0:32773->80/tcp wordpress
e74707db71cc mysql:5.7 "docker-entrypoint.s…" 11 minutes ago Up 11 minutes 3306/tcp, 33060/tcp wordpressdb
- localhost:[해당포트] 에 접속
워드프레스에 접속 결과
🔸 컨테이너 로그 보기
접속이나 페이지 이동 시, 새로운 로그를 확인 할 수 있습니다.
$ docker logs -f wordpress
🔹docker 볼륨 (run -v 사용)
컨테이너는 삭제와 동시에 데이터도 같이 삭제 됩니다. mysql 같은 db는 볼륨 생성을 해서 데이터 보존이 필요합니다. 이번에는 위 예제를 약간 변경하여 볼륨을 이용해 봅시다.
🔸 mysql 컨테이너 생성
- 환경 설정 확인 : mysql docker hub site
-
-v : 호스트와 컨테이너의 디렉토리를 연결. [호스트의 공유 디렉터리]:[컨테이너의 공유 디렉터리]
- 호스트의 공유 디렉터리: 내 컴퓨터에 원하는 디렉터리로 변경해도 좋습니다. - 아래 예제를 하기 위해 해당 디렉터리를 생성 후, 진행해 주세요.
- 컨테이너의 공유 디렉터리: mysql 데이터 저장하는 기본 디렉터리가 /var/lib/mysql 입니다.
$ docker run -d \
--name wordpressdb \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_DATABASE=wordpress \
-v /home/wordpress_db:/var/lib/mysql \
mysql:5.7
🔸 워드프레스 컨테이너 생성 (변경 없음)
- 환경 설정 확인: wordpress docker hub site
$ docker run -d \
-e WORDPRESS_DB_PASSWORD=password \
--name wordpress \
--link wordpressdb:mysql \
-p 80 \
wordpress
🔸 볼륨 공유 확인하기
- 내 컴퓨터 호스트의 공유 디렉터리 로 이동 후, 확인
$ ls
auto.cnf client-cert.pem ib_logfile0 ibtmp1 private_key.pem server-key.pem
ca-key.pem client-key.pem ib_logfile1 mysql public_key.pem sys
ca.pem ib_buffer_pool ibdata1 performance_schema server-cert.pem wordpress
-
컨테이너 공유 디렉터리에 파일 존재 확인
- 호스트의 공유 디렉터리와 동일함을 알 수 있다.
1. 컨테이너에 접속
$ docker exec -it wordpressdb bash
2. mysql 데이터 저장 위치로 이동
# cd /var/lib/mysql
3. 파일 확인
root@d27bb99cfa91:/var/lib/mysql# ls
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 performance_schema public_key.pem server-key.pem wordpress
6. docker 기타 명령어 정리
위에서 배운 명령어 외 기타 명령어 입니다.
🔹 docker history
$ docker history [OPTIONS] [이미지 명:tag]
이미지의 히스토리를 확인할 수 있습니다.🔸 OPTIONS
옵션 | 의미 |
---|---|
–no-trunc | 출력을 자르지 않고, 히스토리 명령어를 끝까지 보여준다. |
🔸 예시
베이스 이미지의 경우 아래와 같은 history 를 확인할 수 있다.
$ docker history ubuntu:16.04
IMAGE CREATED CREATED BY SIZE COMMENT
77be327e4b63 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 4 weeks ago /bin/sh -c mkdir -p /run/systemd && echo 'do… 7B
<missing> 4 weeks ago /bin/sh -c set -xe && echo '#!/bin/sh' > /… 745B
<missing> 4 weeks ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B
<missing> 4 weeks ago /bin/sh -c #(nop) ADD file:1f70668251e2e58ce… 124MB
🔹 docker cp
$ docker cp [컨테이너 이름]:[가져올 파일의 경로] [호스트 경로]
컨테이너 안에 있는 파일을 꺼낼 수 있습니다.🔸 예시
위에서 진행한 컨테이너의 hosts 파일을 가져와 봅시다.
$ docker cp wordpressdb:/etc/hosts ./
$ ls
hosts
🔹 docker inspect
$ docker inspect [이미지 또는 컨테이너 이름]
이미지 또는 컨테이너의 세부 정보를 출력합니다.🔸 예시
$ docker inspect wordpress
[
{
"Id": "8f75f55337e0f9919f02446e25cfe1afd9c97eacce13483cbc62d020465c30ef",
"Created": "2020-03-22T01:51:36.2863858Z",
"Path": "docker-entrypoint.sh",
"Args": [
"apache2-foreground"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 16681,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-03-22T01:51:36.8741324Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
...
마무리
이번 시간에는 도커를 직접 사용해 봤습니다. 다음 시간에는 아래의 내용을 학습할 예정입니다. 😀
- docker hub에 올려보기 Dockerfile 만들기
- docker hub에 이미지 올려보기