-
docker를 사용해보자 (docker 기본 명령어 사용해보기)개발/docker 2020. 7. 10. 11:04728x90
이번 시간에는 이전에 배운 개념을 토대로 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
- client: 현재 나의 컴퓨터. OS/Arch를 보면 제 컴퓨터가 mac이라서 darwin/amd64라고 확인할 수 있습니다.
- server: 실제 컨테이너를 생성 및 실행하며 이미지를 관리합니다. Client가 명령어를 전달하면 Server가 명령어를 받아 실행합니다.
3. docker 이미지 다루기 - 자주 사용하는 명령어 정리
🔹 docker search
docker hub에 존재하는 이미지 리스트를 확인할 수 있다.
$ docker search [검색할 이미지명]
- 예시
$ 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의 이미지를 다운로드한다.
- 저장소: 도커 허브에 존재. https://registry.hub.docker.com/_/ubuntu?tab=description에서 확인 가능
$ 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
컨테이너를 생성하고 실행하기. 사용할 이미지가 저장되어 있는지 확인하고 없다면 다운로드(pull)를 한 후 컨테이너를 생성(create)하고 시작(start) 한다.
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
- OPTIONS
option Description -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
option Description --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
option Description --force , -f 실행중인 컨테이너를 강제로 제거한다. (uses SIGKILL) - 예시
$ docker rm -f test
🔹 docker start
stop 된 컨테이너를 실행하기
docker start [OPTIONS] 컨테이너1 [컨테이너2...]
🔹 docker stop
실행 중인 컨테이너를 stop 하기
docker stop [OPTIONS] 컨테이너1 [컨테이너2...]
🔹 docker logs
도커 컨테이너의 로그 확인하기
docker logs [OPTIONS] CONTAINER
- OPTIONS
option Description --follow , -f 실시간 로그 생성 --tail <number> 마지막 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 컨테이너 생성
- 환경 설정 확인 : https://registry.hub.docker.com/_/mysql
docker run -d \ --name wordpressdb \ -e MYSQL_ROOT_PASSWORD=password \ -e MYSQL_DATABASE=wordpress \ mysql:5.7
- 워드프레스 컨테이너 생성
- 환경 설정 확인: https://registry.hub.docker.com/_/wordpress
- -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 컨테이너 생성
- 환경 설정 확인 : https://registry.hub.docker.com/_/mysql
- -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
- 워드프레스 컨테이너 생성 (변경 없음)
$ 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
option Description --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" }, ...
마무리
이번 시간에는 도커를 직접 사용해 봤습니다. 다음 시간에는 아래의 내용을 학습할 예정입니다. 😀
- Dockerfile를 사용하여 도커 이미지 만들기
- docker hub에 이미지 올려보기
'개발 > docker' 카테고리의 다른 글
도커 자동 배포하기 - jenkins (1) 2020.08.07 도커 컴포즈 사용하기 (1) 2020.08.07 docker 이미지를 만들어보자 (6) 2020.08.07 docker에 대해 알아보자! (docker 기본) (0) 2020.06.26