컨테이너 실행하기
컨테이너 실행 명령어는 다음과 같다
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
옵션 | 설명 |
---|---|
-d --detach | Detached mode(백그라운드 모드) |
-p --publish | 호스트와 컨테이너의 포트 연결(포트 포워딩) |
-v --volume | 호스트와 컨테이너의 디렉토리 연결(파일을 호스트에 바로 저장, 마운트개념) |
--rm | 프로세스 종료 시 컨테이너 자동 제거 |
--name | 컨테이너 이름 지정 |
-i --interactive | 표준 입력(stdin)을 활성화, bash 사용시 사용 |
-t --tty | TTY 모드를 사용, bash 사용시 사용, 해당 명령을 사용하지 않으면 명령은 할 수 있겠지만 쉘이 표시되지 않음 |
Ubuntu 16.04 컨테이너 실행
ubuntu 16.04 이미지 이름을 입력하여 컨테이너 실행, 로컬에 저장되어 있는지 확인하고 없으면 다운로드(pull) 한다.
docker run ubuntu:16.04
별다른 명령을 안했기 때문에 실행중인 프로세스가 없는 ubuntu 컨테이너는 자동 종료된다. 이번에는 /bin/bash
를 실행 해보자
docker run -it --rm ubuntu:16.04 /bin/bash
컨테이너가 바로 실행되고 bash를 사용할 수 있게 된다.
cat /etc/issue
Ubuntu 16.04.7 LTS \n \l
ls
bin boot dev etc home lib lib64 media mnt
opt proc root run sbin srv sys tmp usr var
컨테이너 실행 시 컨테이너 내부에서 명령어를 실행하기 위해 bash 쉘을 실행했고, 입력을 위해 -it
옵션을 추가, 종료시 컨테이너 제거를 위해 --rm
옵션을 추가하였다
cat /etc/issue
와 ls
로 ubuntu환경인 것을 확인 가능하다. exit
명령어로 종료와 함께 컨테이너 제거가 된다.
Detached 모드로 Redis 컨테이너 실행
-d 로 Detached 모드로 실행하고, -p 모드로 redis port 6379를 호스트에서 1234로 포워딩하여 실행해보고 exec
명령어로 redis 컨테이너에서 redis-cli를 실행해보자
docker run -d --name redis-test -p 1234:6379 redis
docker exec -it redis-test redis-cli
# in redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set test 1234
OK
127.0.0.1:6379> keys *
1) "test"
127.0.0.1:6379> get test
"1234"
redis-cli로 접근하여 키를 저장해보고 불러보았다 매우 쉽게 redis를 사용해 볼 수 있다
MySQL 5.7 컨테이너 실행
https://hub.docker.com/_/mysql에 들어가면 환경변수에 관한 설명을 참고할 수 있다. 환경변수는 -e
옵션으로 설정한다. --name
옵션으로 컨테이너 이름을 설정하면 다른 명령어에서 쉽게 사용가능하다
docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.7
--name
옵션을 생략하면 자동으로 컨테이너이름이 생성되는데, 유명한 과학자나 해커의 이름과 수식어를 조합하여 랜덤으로 생성한다
컨테이너 생성 후 DB 툴로 접속해보자 주소는 localhost:3306
root
계정을 이용한다.
도커 기본 명령어
컨테이너의 상태를 확인하고, 이미지의 상태를 확인하고 관리해보자
ps - 컨테이너 목록 확인하기
docker ps [OPTIONS]
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb1c3db80d42 mysql:5.7 "docker-entrypoint.s…" 13 minutes ago Up 13 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
ed9e6c4c1775 redis "docker-entrypoint.s…" 35 minutes ago Up 35 minutes 0.0.0.0:1234->6379/tcp redis-test
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb1c3db80d42 mysql:5.7 "docker-entrypoint.s…" 15 minutes ago Up 15 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
ed9e6c4c1775 redis "docker-entrypoint.s…" 37 minutes ago Up 37 minutes 0.0.0.0:1234->6379/tcp redis-test
55de267345a0 ubuntu:16.04 "/bin/bash" 2 hours ago Exited (0) 2 hours ago nice_ardinghelli
옵션 -a를 사용하면 삭제를 한건 아니기 때문에 종료된 컨테이너도 보인다.
stop - 컨테이너 중지하기
실행중인 컨테이너를 중지한다
docker stop cb1c3db80d42 # 정지할 컨테이너 id 입력
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb1c3db80d42 mysql:5.7 "docker-entrypoint.s…" 20 minutes ago Exited (0) 3 seconds ago mysql
mysql 컨테이너를 정지해보기 위해 docker ps
명령어로 mysql 컨테이너의 id를 stop
명령어에 입력하자. 참고로 컨테이너 id는 겹치지 않으면 앞의 2자리~4자리만 입력하여도 된다. 해당 컨테이너를 정지하고 다시 ps -a
해보면 정지된 것을 확인 할 수 있다.
rm - 컨테이너 제거하기
종료된 컨테이너를 완전히 제거한다
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb1c3db80d42 mysql:5.7 "docker-entrypoint.s…" 32 minutes ago Exited (0) 12 minutes ago mysql
ed9e6c4c1775 redis "docker-entrypoint.s…" 54 minutes ago Up 54 minutes 0.0.0.0:1234->6379/tcp redis-test
55de267345a0 ubuntu:16.04 "/bin/bash" 3 hours ago Exited (0) 3 hours ago nice_ardinghelli
docker rm 55de cb1c
mysql과 ubuntu 컨테이너를 삭제 해보았다. 이후 ps -a
로 확인 해보면 삭제된 것을 확인 할 수 있다.
images - 이미지 목록 확인하기
도커가 다운로드한 이미지 목록을 확인한다
docker images [OPTIONS] [REPOSITORY[:TAG]]
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 604d80444252 3 days ago 117MB
mysql 5.7 2a0961b7de03 2 weeks ago 462MB
ubuntu 16.04 b6f507652425 9 months ago 135MB
이미지 목록과 태크, ID, 생성시점, 용량을 확인 가능하다
pull - 이미지 다운로드
이미지를 다운로드한다
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker pull ubuntu:16:04
rmi - 이미지 삭제하기
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 604d80444252 3 days ago 117MB
mysql 5.7 2a0961b7de03 2 weeks ago 462MB
docker rmi 2a09
Untagged: mysql:5.7
Untagged: mysql@sha256:7e99b2b8d5bca914ef31059858210f57b009c40375d647f0d4d65ecd01d6b1d5
Deleted: sha256:2a0961b7de03c7b11afd13fec09d0d30992b6e0b4f947a4aba4273723778ed95
Deleted: sha256:2fbd454d39f146da1c0747174089b983c1cf1da7a062384e5a71a94f540141ab
Deleted: sha256:60ce6f6a8d71e66bd7ca1dae1f84a5faedfb993c1a0f352b90597b73eb94d56e
Deleted: sha256:226a653f6ee6b0184d7a6304f29976dc89b0e54e2eec2027d0e3cf87cbe8f2af
Deleted: sha256:218468cc1e9e25a831221617115da837798856793eb7decb3b089c8a1b5bd98f
Deleted: sha256:aea4fcaf4a44b4ce254718a5699557d5a278182a060683e9fcab117281c710c5
Deleted: sha256:87e7690acc799fa14efd95056b81ca599d7587771add57bb73f9066e3a1a1d10
Deleted: sha256:efb1655b4e285047d5fc78392e33a2f0b4156997e69b0833a6b78774674085d6
Deleted: sha256:fabb64857683e1f35472debb5a12a6bf2e081b5766c69874c0528086737434fb
Deleted: sha256:cf7b1ec7aec8704bd8369c4307ecf4931b0afd2d3f912c0a6066c2ac6443ac28
Deleted: sha256:6c9d31c0820816a60a4320711febf8710a1d053f1f3a424e1f071b65263da7d1
Deleted: sha256:10e6bc6fdee2d9a0d1ac5e78a031b5670f37d75599ba609cbd1d027af78f7bf4
실행중인 컨테이너는 이미지의 레이어기반으로 실행되므로 삭제할 수 없다.
컨테이너 둘러보기
logs - 컨테이너 로그보기
컨테이너의 로그를 확인한다
docker logs [OPTIONS] CONTAINER
docker logs redis-test
1:C 17 Jun 2022 07:56:23.572 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 17 Jun 2022 07:56:23.572 # Redis version=7.0.2, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 17 Jun 2022 07:56:23.572 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 17 Jun 2022 07:56:23.572 * monotonic clock: POSIX clock_gettime
1:M 17 Jun 2022 07:56:23.573 * Running mode=standalone, port=6379.
1:M 17 Jun 2022 07:56:23.573 # Server initialized
1:M 17 Jun 2022 07:56:23.573 * Ready to accept connections
-tail
옵션으로 출력 라인 수를 지정할 수 있다.
docker logs --tail 5 redis-test
1:C 17 Jun 2022 07:56:23.572 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 17 Jun 2022 07:56:23.572 * monotonic clock: POSIX clock_gettime
1:M 17 Jun 2022 07:56:23.573 * Running mode=standalone, port=6379.
1:M 17 Jun 2022 07:56:23.573 # Server initialized
1:M 17 Jun 2022 07:56:23.573 * Ready to accept connections
-f
옵션으로 실시간으로 로그를 조회할 수 있다.
exec - 컨테이너 명령어 실행하기
컨테이너를 관리하다보면 컨테이너에 접속하여 컨테이너 파일을 실행하고 싶어질 때가 있다. SSH는 권장되지 않는다고 하니 exec
명령어를 사용하면 된다.
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it mysql /bin/bash
root@6fe9822cf342:/# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.38 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
mysql>
-it
옵션은 키보드 입력을 위해 주었고, bash 쉘로 접속하여 작업을 진행하였다
컨테이너 업데이트
컨테이너를 새로운 버전으로 업데이트 하는 방법은
- 새 버전 이미지를 다운로드 (pull)
- 기존 컨테이너 삭제 (stop, rm)
- 새 컨테이너 생성(run)
과정으로 업데이트 하면 된다. 하지만 mysql 컨테이너를 이렇게 업데이트하면 데이터가 날아갈 것이다. 이를 위해 컨테이너 삭제시 유지해야하는 데이터는 컨테이너 내부가 아닌 외부에 저장하여야 한다.
가장 좋은 방법은 클라우드 서비스(AWS S3 등)을 이용하는 것이고, 데이터 볼륨을 추가하여 호스트의 디렉토리를 마운트해서 사용하는 방법이 있다. run 옵션중 -v
옵션으로 가능하다.
#before
docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:5.72
#after
docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql -v c:\test:/var/lib/mysql mysql:5.7
/c/test
$ ls -al
total 188582
drwxr-xr-x 1 twlee 197121 0 6월 17 18:25 ./
drwxr-xr-x 1 twlee 197121 0 6월 17 18:17 ../
-rw-r--r-- 1 twlee 197121 56 6월 17 18:25 auto.cnf
-rw-r--r-- 1 twlee 197121 1112 6월 17 18:25 ca.pem
-rw-r--r-- 1 twlee 197121 1680 6월 17 18:25 ca-key.pem
-rw-r--r-- 1 twlee 197121 1112 6월 17 18:25 client-cert.pem
-rw-r--r-- 1 twlee 197121 1676 6월 17 18:25 client-key.pem
-rw-r--r-- 1 twlee 197121 1352 6월 17 18:25 ib_buffer_pool
-rw-r--r-- 1 twlee 197121 50331648 6월 17 18:25 ib_logfile0
-rw-r--r-- 1 twlee 197121 50331648 6월 17 18:25 ib_logfile1
-rw-r--r-- 1 twlee 197121 79691776 6월 17 18:25 ibdata1
-rw-r--r-- 1 twlee 197121 12582912 6월 17 18:25 ibtmp1
drwxr-xr-x 1 twlee 197121 0 6월 17 18:25 mysql/
drwxr-xr-x 1 twlee 197121 0 6월 17 18:25 performance_schema/
-rw-r--r-- 1 twlee 197121 1676 6월 17 18:25 private_key.pem
-rw-r--r-- 1 twlee 197121 452 6월 17 18:25 public_key.pem
-rw-r--r-- 1 twlee 197121 1112 6월 17 18:25 server-cert.pem
-rw-r--r-- 1 twlee 197121 1676 6월 17 18:25 server-key.pem
drwxr-xr-x 1 twlee 197121 0 6월 17 18:25 sys/
각자의 환경에 맞춰 디렉토리를 변경 해주면 해당 디렉토리로 마운트 되어 파일을 확인 할 수 있다. 이제 컨테이너를 삭제해도 해당 파일은 삭제되지 않으니 컨테이너를 업데이트해도 디렉토리 마운트 후 기존 데이터 그대로 사용할 수 있다.
참고
https://docs.docker.com/engine/reference/run/
https://subicura.com/2017/01/19/docker-guide-for-beginners-2.html
'Infrastructure' 카테고리의 다른 글
[Docker] build 시 apk ssl certificate verify failed, apk permission denied 발생 시 (0) | 2024.09.26 |
---|---|
[Docker] 1. 설치 (0) | 2022.06.17 |
Window 10 Redis 설치하기 (0) | 2020.10.14 |
Amazon AWS Cloud Computing (0) | 2020.08.03 |