Intro
여기서는 가볍게 자주 쓰는 명령어만 다룬다.
모든 명령어는 여기서 참고하자.
컨테이너 사용 명령어의 기본 형태
docker 커맨드 (옵션) 대상 (인자)
컨테이너를 다루는 모든 명령은 docker로 시작한다.
컨테이너 실행
✔ 도커 실행 명령어
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
✔ 자주 사용하는 옵션
옵션 | 설명 |
-d | 백그라운드 모드(detached mode) |
-p | 호스트와 컨테이너의 포트 연결(포워딩) |
-v | 호스트와 컨테이너의 디렉토리 연결(마운트) |
-e | 컨테이너 내에서 사용할 환경변수 설정 |
-name | 컨테이너 이름 설정 |
-rm | 프로세스 종료 시 컨테이너 자동 제거 |
-it | 터미널 입력 옵션 (-i, -t) |
-link | 컨테이너 연결 [컨테이너명:별칭] |
1) ubuntu 22.04 container
ubuntu 22.04 컨테이너를 생성하고 컨테이너 내부에 들어가 보자.
docker run ubuntu:22.04
run 명령어를 사용하면 사용할 이미지가 저장되어 있는지 확인하고,
없다면 다운로드(pull)를 한 후 컨테이너를 생성(create)하고 시작(start)한다.
여기서는 ubuntu:22.04 이미지를 다운 받은 적이 없기 때문에 이미지를 다운로드 한 후 컨테이너가 실행되었다.
컨테이너는 정상적으로 실행되었지만, 명령어를 전달하지 않았기 때문에 생성되자마자 종료되었다.
컨테이너는 프로세스이기 때문에 실행 중인 프로세스가 없다면 컨테이너는 종료된다.
이번에는 /bin/bash 명령어를 입력해서 ubuntu:22.04 컨테이너를 실행해 보자.
docker run --rm -it ubuntu:16.04 /bin/bash
# in container
$ cat /etc/issue
Ubuntu 22.04.4 LTS \n \l
$ ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
- bin/bash: 컨테이너 내부에 들어가기 위해 실행하는 쉘
- -it: 키보드 입력을 위한 옵션
- --rm: 프로세스가 종료되면 컨테이너 자동 삭제
- exit: bash 쉘을 종료하면 컨테이너도 같이 종료
이번에는 위에서 이미지를 다운 받아놨기 때문에 이미지를 다운로드 하는 과정 없이 바로 실행되었다.
2) Redis container
redis는 메모리 기반의 스토리지이다. 6379 포트로 통신하며 telnet 명령어로 테스트해 볼 수 있다.
detached mode로 실행하기 위해 -d 옵션을 추가하고, 컨테이너의 포트를 호스트의 포트로 연결하기 위해 -p 옵션을 추가하자.
docker run -d -p 1234:6379 redis
# redis test
$ telnet localhost 1234
set mykey hello
+OK
get mykey
$5
hello
-d 옵션을 주었기 때문에 컨테이너를 실행하자마자 컨테이너의 ID(5165d6...)를 보여 주고 바로 쉘로 돌아온다.
컨테이너는 종료된 것이 아니라 백그라운드 모드로 동작하고 있고 컨테이너 ID를 이용하여 컨테이너를 제어할 수 있다.
-p 옵션을 이용하여 호스트의 1234 포트를 컨테이너의 6379 포트로 연결하였고, localhost의 1234 포트로 접속하면 redis를 사용할 수 있다.
호스트의 포트만 다르게 하면 하나의 서버에 여러 개의 redis 서버를 띄우는 것도 매우 간단하다.
3) MySQL 8.0 container
사용법: https://hub.docker.com/_/mysql/
호스트 OS에 MySQL 클라이언트가 설치되어 있어야 한다.
-e 옵션을 이용하여 환경변수를 설정하고, --name 옵션을 이용하여 컨테이너에 읽기 어려운 ID 대신 쉬운 이름(mysql)을 부여했다.
패스워드 없이 root 계정을 만들기 위해 MYSQL_ALLOW_EMPTY_PASSWORD 환경변수를 설정했다.
백그라운드 모드로 띄우기 위해 -d 옵션을 설정하고, 3307 포트를 사용했다.
(3306 포트로 했다가 기존 MySQL 서버와 충돌이 난 건지 계속 오류가 떠서 임시로 3307 포트로 진행했다.)
docker run -d -p 3307:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:8.0
# MySQL test
$ mysql -h127.0.0.1 -uroot
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql> quit
4) WordPress container
위에서 생성했던 MySQL 컨테이너에 워드프레스 데이터베이스를 만들고, 워드프레스 컨테이너를 실행할 때 --link 옵션을 이용하여 MySQL 컨테이너를 연결해 보자.
--link 옵션은 환경변수와 IP 정보를 공유하는데, 링크한 컨테이너의 IP 정보를 /etc/hosts에 자동으로 입력한다.
그래서 워드프레스 컨테이너가 MySQL 데이터베이스의 정보를 알 수 있는 것이다.
1. 워드프레스용 데이터베이스 생성
2. 워드프레스 컨테이너 실행
- 호스트의 8080포트를 컨테이너의 80포트로 연결, MySQL 컨테이너와 연결
- 각종 데이터베이스 설정 정보를 환경변수로 입력
# create mysql database
$ docker exec -it mysql mysql -uroot -p
create database wp CHARACTER SET utf8;
create user 'wp'@'%' identified by 'wp';
grant all privileges on wp.* to 'wp'@'%' with grant option;
flush privileges;
quit
# run wordpress container
docker run -d -p 8080:80 \
--link mysql:mysql \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress
이제 컨테이너가 제대로 실행되었는지 웹 브라우저로 확인해 보자. [실행 완료!]
http://localhost:8080/wp-admin/install.php?step=1
참고
이번 예제는 테스트 용으로만 사용해야 한다. 운영 환경에서 사용하려면 추가 세팅이 필요하다.
도커 기본 명령어
컨테이너의 상태를 살펴 보고 어떤 이미지가 설치되어 있는지 확인하는 명령어를 알아보자.
1) 컨테이너 목록 확인하기(ps)
docker ps [OPTIONS]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745adc0cf30e teamlab/pydata-tensorflow:0.1 "/opt/start" 4 minutes ago Up 4 minutes 0.0.0.0:6006->6006/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp mystifying_hawking
1c31d6c6edca wordpress "docker-entrypoint.s…" 31 minutes ago Up 31 minutes 0.0.0.0:8080->80/tcp quizzical_lewin
ce33ab37a923 mysql:8.0 "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp mysql
e6a452c59a12 redis "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:1234->6379/tcp heuristic_northcutt
detached mode로 실행 중인 컨테이너들이 출력된다.
어떤 이미지를 기반으로 만들었는지, 어떤 포트와 연결되어 있는지 등을 볼 수 있다.
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745adc0cf30e teamlab/pydata-tensorflow:0.1 "/opt/start" 7 minutes ago Up 7 minutes 0.0.0.0:6006->6006/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp mystifying_hawking
1c31d6c6edca wordpress "docker-entrypoint.s…" 34 minutes ago Up 34 minutes 0.0.0.0:8080->80/tcp quizzical_lewin
ce33ab37a923 mysql:8.0 "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp mysql
6b7bb3228401 wordpress "docker-entrypoint.s…" 2 hours ago Created 80/tcp, 0.0.0.0:8080->8080/tcp angry_galois
c6eaa3c348c1 wordpress "docker-entrypoint.s…" 2 hours ago Created 0.0.0.0:8080->80/tcp mystifying_wilson
02a401a67051 wordpress "docker-entrypoint.s…" 2 hours ago Created 0.0.0.0:8080->80/tcp blissful_babbage
3b0d6baa155b wordpress "docker-entrypoint.s…" 2 hours ago Created 0.0.0.0:8080->80/tcp silly_chatelet
d2183b1e6cd5 redis "docker-entrypoint.s…" 3 hours ago Created condescending_vaughan
5165d6cfa75f redis "docker-entrypoint.s…" 4 hours ago Created agitated_pascal
6bc590bdd4bb redis "docker-entrypoint.s…" 4 hours ago Created objective_archimedes
1ef262ae35b2 redis "docker-entrypoint.s…" 4 hours ago Created objective_bhaskara
e6a452c59a12 redis "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:1234->6379/tcp heuristic_northcutt
c34f624d8c97 ubuntu:22.04 "/bin/bash" 9 hours ago Exited (0) 9 hours ago nervous_shaw
-a 옵션을 추가로 실행하면, 실행했다가 종료된 컨테이너가 추가로 출력된다.
컨테이너는 종료되어도 삭제되지 않고 남아 있다. 종료된 건 다시 시작할 수 있고 컨테이너의 읽기/쓰기 레이어는 그대로 존재한다.
2) 컨테이너 중지(stop)
docker stop [OPTIONS] CONTAINER [CONTAINER...]
root@DESKTOP-DOPLEQK:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745adc0cf30e teamlab/pydata-tensorflow:0.1 "/opt/start" 10 minutes ago Up 10 minutes 0.0.0.0:6006->6006/tcp, 22/tcp, 0.0.0.0:8888->8888/tcp mystifying_hawking
root@DESKTOP-DOPLEQK:~# docker stop 745adc0cf30e
745adc0cf30e //tensorflow ID
root@DESKTOP-DOPLEQK:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745adc0cf30e teamlab/pydata-tensorflow:0.1 "/opt/start" 10 minutes ago Exited (137) 5 seconds ago mystifying_hawking
컨테이너를 중지하려면 컨테이너의 ID 또는 이름을 입력하면 된다.
도커 ID의 길이는 64자리지만, 명령어의 인자로 전달할 때에는 전부 입력하지 않아도 된다.
ex) ID: abcdefgh..... -> abcd 입력만 해도 됨(겹치지만 않는다면!)
중지 시킨 컨테이너의 상태를 보면 Exited 상태로 변경된 걸 확인할 수 있다.
3) 컨테이너 제거(rm)
docker rm [OPTIONS] CONTAINER [CONTAINER...]
root@DESKTOP-DOPLEQK:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
745adc0cf30e teamlab/pydata-tensorflow:0.1 "/opt/start" 10 minutes ago Exited (137) 5 seconds ago mystifying_hawking
#tensorflow 컨테이너 제거
root@DESKTOP-DOPLEQK:~# docker rm 745a
745a
#컨테이너가 말끔히 제거되었다.
root@DESKTOP-DOPLEQK:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1c31d6c6edca wordpress "docker-entrypoint.s…" 43 minutes ago Up 43 minutes 0.0.0.0:8080->80/tcp quizzical_lewin
ce33ab37a923 mysql:8.0 "docker-entrypoint.s…" About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3307->3306/tcp mysql
6b7bb3228401 wordpress "docker-entrypoint.s…" 2 hours ago Created 80/tcp, 0.0.0.0:8080->8080/tcp angry_galois
c6eaa3c348c1 wordpress "docker-entrypoint.s…" 2 hours ago Created 0.0.0.0:8080->80/tcp mystifying_wilson
02a401a67051 wordpress "docker-entrypoint.s…" 2 hours ago Created 0.0.0.0:8080->80/tcp blissful_babbage
3b0d6baa155b wordpress "docker-entrypoint.s…" 2 hours ago Created 0.0.0.0:8080->80/tcp silly_chatelet
d2183b1e6cd5 redis "docker-entrypoint.s…" 4 hours ago Created condescending_vaughan
5165d6cfa75f redis "docker-entrypoint.s…" 4 hours ago Created agitated_pascal
6bc590bdd4bb redis "docker-entrypoint.s…" 4 hours ago Created objective_archimedes
1ef262ae35b2 redis "docker-entrypoint.s…" 4 hours ago Created objective_bhaskara
e6a452c59a12 redis "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:1234->6379/tcp heuristic_northcutt
c34f624d8c97 ubuntu:22.04 "/bin/bash" 9 hours ago Exited (0) 9 hours ago nervous_shaw
중지 상태의 컨테이너 일괄 삭제
docker rm -v $(docker ps -a -q -f status=exited)
4) 이미지 목록 확인하기(images)
docker images [OPTIONS] [REPOSITORY[:TAG]]
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 01afb31d6d63 5 days ago 173MB
wordpress latest f468bab53528 2 weeks ago 972MB
mysql 8.0 aba83ec239df 3 weeks ago 778MB
ubuntu 22.04 a6d2b38300ce 4 weeks ago 117MB
teamlab/pydata-tensorflow 0.1 cb5e036afc0a 7 years ago 4.59GB
5) 이미지 다운로드(pull)
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull ubuntu:22.04
6) 이미지 삭제(rmi)
docker rmi [OPTIONS] IMAGE [IMAGE...]
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 01afb31d6d63 5 days ago 173MB
wordpress latest f468bab53528 2 weeks ago 972MB
mysql 8.0 aba83ec239df 3 weeks ago 778MB
ubuntu 22.04 a6d2b38300ce 4 weeks ago 117MB
teamlab/pydata-tensorflow 0.1 cb5e036afc0a 7 years ago 4.59GB
#tensorflow 삭제
root@DESKTOP-DOPLEQK:~# docker rmi cb5e
Untagged: teamlab/pydata-tensorflow:0.1
Deleted: sha256:cb5e036afc0aa647a6fe1f384475275aeed946c751de5209d84282c986589b7f
단, 컨테이너에서 실행 중인 이미지는 삭제할 수 없다.
7) 컨테이너 로그 확인(logs)
docker logs [OPTIONS] CONTAINER
#워드프레스의 마지막 10개의 로그 확인
root@DESKTOP-DOPLEQK:~# docker logs --tail 10 1c31
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-includes/js/dist/i18n.min.js?ver=5e580eb46a90c2b997e6 HTTP/1.1" 200 4012 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-admin/js/password-strength-meter.min.js?ver=6.5.3 HTTP/1.1" 200 964 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-includes/js/dist/vendor/wp-polyfill.min.js?ver=3.15.0 HTTP/1.1" 200 14177 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-includes/js/wp-util.min.js?ver=6.5.3 HTTP/1.1" 200 1098 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-includes/js/underscore.min.js?ver=1.13.4 HTTP/1.1" 200 7655 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-admin/js/user-profile.min.js?ver=6.5.3 HTTP/1.1" 200 2705 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /favicon.ico HTTP/1.1" 302 404 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-includes/js/zxcvbn.min.js HTTP/1.1" 200 400393 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
172.17.0.1 - - [28/May/2024:09:20:02 +0000] "GET /wp-admin/install.php HTTP/1.1" 200 4663 "http://localhost:8080/wp-admin/install.php?step=1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
127.0.0.1 - - [28/May/2024:09:20:07 +0000] "OPTIONS * HTTP/1.0" 200 126 "-" "Apache/2.4.59 (Debian) PHP/8.2.19 (internal dummy connection)"
번외) 실시간으로 로그 확인 (-f 옵션)
docker logs -f 1c31 #워드프레스 ID
로그를 켜 놓은 상태에서 워드프레스 페이지를 새로고침하여 로그를 업데이트하는 방식으로 확인했다.
실시간 로그를 중지하려면 ctrl + c를 입력하면 된다.
도커는 로그 파일을 자동으로 감지하는 것이 아닌, 표준 스트림(Standard streams) 중 stdout, stderr를 수집한다.
따라서 컨테이너에서 실행되는 프로그램의 로그 설정을 표준 출력으로 바꾸어야 한다.
단지 출력 방식만 바꾸는 것으로 모든 컨테이너는 로그에 대해 같은 방식으로 관리할 수 있게 된다.
그리고 컨테이너의 로그 파일은 JSON 방식으로 저장된다.
도커는 다양한 플러그인을 지원하여 JSON이 아닌 특정 로그 서비스에 스트림을 전달할 수 있다.
어느 정도 앱의 규모가 커지면 기본적인 방식 대신 로그 서비스를 이용하는 걸 고려해야 한다.
8) 컨테이너 명령어 실행(exec)
컨테이너를 관리하다 보면 실행 중인 컨테이너에 들어가 보거나, 컨테이너의 파일을 실행하고 싶을 때가 있다.
컨테이너에 SSH를 설치하면 되지 않을까? -> 권장하지 않는다.
예전에는 nsenter라는 프로그램을 이용하였는데, 도커에 exec라는 명령어로 흡수되었다.
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
run 명령어와 유사해 보이지만 차이가 있다.
- run: 새로 컨테이너를 만들어서 실행
- exec: 실행 중인 컨테이너에 명령어 실행
실행 중인 MySQL 컨테이너에 접속해보자.
키보드 입력이 필요하므로 -it 옵션을 주었다.
이렇게 컨테이너에 접속하면 컨테이너를 마음대로 관리할 수 있다.
참고: https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
'log.info' 카테고리의 다른 글
[Docker] 이미지, 컨테이너 요약 (0) | 2024.06.13 |
---|---|
[Docker] 이미지 만들기 (0) | 2024.05.29 |
[Docker] 컨테이너 업데이트, Docker Compose (0) | 2024.05.28 |
[Docker] 설치 (0) | 2024.05.28 |
[Docker] Docker란? (0) | 2024.05.28 |