Docker 실행하기
Docker 를 설치하고 나면 이제 실행을 해야 한다. 우선, 원래 실행 방법은 다음과 같은 순서를 따른다.
- Docker 이미지 다운로드
- 다운로드 된 Docker 이미지를 가지고 Container 생성
- Container 실행
Docker 이미지 다운로드는 pull 명령어를 이용하면 된다.
Docker ps -a
Docker 에서 실행중이거나 중지된 Container 의 목록을 보여 준다.
Docker create -t -i imageId /bin/bash [ –name naming ]
Docker Container 를 생성한다. -t 는 tty 를 할당하고 하게 -i 는 Interactive 를 말한다. 보통 -t, -i 옵션을 붙여서 -it 로 붙여서 쓴다. -i 옵션으로 인해서 STDIN 을 받을 수 있는데 이는 /bin/bash 를 통해서 받도록 한다.
1 2 3 4 5 |
$ docker create -t -i f975c5035748 /bin/bash acc07a9fe8a74cb6453f705f3f8a0a1687f23cc2d2775e4639a0a6a4ab9ea287 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES acc07a9fe8a7 f975c5035748 "/bin/bash" 3 seconds ago Created stoic_edison |
Docker 를 생성하면 Container 는 Stopped 된 상태가 된다.
Docker start containerId
정지한 Container 를 start 한다.
Docker start containerId
실행중인 Container 를 stop 한다.
Docker attach containerId
현재 사용하고 있는 Terminal 에 STDIN, STDOUT, STDERROR 를 실행중인 Container 에 붙인다.
1 2 |
$ docker attach acc07a9fe8a7 root@acc07a9fe8a7:/# |
앞에서 생성한 Container 에 붙었다. 여기서 다음과 같이 한가지 재미있는 사실을 발견하게 된다.
1 2 3 4 5 6 7 8 9 10 |
top - 13:11:27 up 56 min, 0 users, load average: 0.00, 0.00, 0.00 Tasks: 2 total, 1 running, 1 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.7 id, 0.2 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2047852 total, 1121292 free, 228360 used, 698200 buff/cache KiB Swap: 2095100 total, 2095100 free, 0 used. 1644724 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 18236 3228 2752 S 0.0 0.2 0:00.02 bash 14 root 20 0 36664 3112 2660 R 0.0 0.2 0:00.00 top |
Container 내에서 top 을 실행해 보면 bash 와 top 두개만 보인다. 원래 리눅스 머신이라면 커널 프로세스들이 모두 보여야 하지만 Container 는 그렇게 실행이 안된다는 사실을 보여준다.
1 2 |
root@acc07a9fe8a7:/# pstree -p bash(1)---pstree(305) |
정확하게 Container 가 어떻게 동작하는지를 보여준다.
Container 는 프로세스 격리 모두라는 사실을 보여주는 것이다. bash 를 기반으로 리눅스를 실행하고 Container 안에서 리눅스에서 실행된 명령어만 프로세스로 보인다.
exit 를 하면 Container 에서의 bash 가 종료 된다. 이렇게되면 Container 내에 프로세스가 동작하는게 하나도 없게되서 결국 Container 는 정지가 된다.
Dettach는 없다. 대신에 daemon mode 로 실행을 시켜주거나 잠시 Interactive 모드로 전환할 수는 있다. attach 된 상태에서 Ctrl + P + Q 를 하면 컨테이너를 빠져나오게 된다.
docker run [Options] imageId [Command]
Container 에 명령어를 실행하도록 한다. 만일 Image 가 없다면 Pull 하고 Container 를 Create 하고 Start 한 후에 명령어를 실행해 준다.
그래서 OS 같은 것을 실행하고 싶다면 다음과 같이 많이 사용한다.
1 |
$ docker run -it ubuntu:16.04 /bin/bash |
서비스로 실행 시키기
서비스만 올릴 수 있다. 프로세스 격리모드로 동작하는 docker 에서는 OS를 구동할 필요가 없다. 그냥 서비스만 올릴 수 있다. Apache Httpd, Nginx, Redis, MySQL 등과 같이 외부와 통신을 하는 서비스들만 올리는게 가능하다.
서비스만 올리기에서 핵심은 외부와의 통신을 위한 방법을 제시해야 한다는 것이다. Redis 를 예를들어 보자.
1 2 3 4 5 |
~$ docker run -d -p 1234:6379 redis 82dfb9cc80ac2d66303a8acfc102aab7fa09000923236314e9e59979c8b87a6a ~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82dfb9cc80ac redis "docker-entrypoint.s…" 27 seconds ago Up 26 seconds 0.0.0.0:1234->6379/tcp loving_elbakyan |
위와같이 Redis 가 구동 되었다.
핵심이 두가지다. 서비스로 실행 시킬시에는 Bash 와같은 Interactive 를 할 수 없다. 따라서 Daemon 모드로 실해하기 위해서 -d 옵션을 준다. -p 로 포트 매핑을 해준다.
포트 매핑은 Docker Container 에서의 포트와 외부 노출되는 포트를 매핑해 주는 것으로 이는 브릿지 네트워크 모드를 이용할때 사용한다.
따라서 외부에서 접속을 하기위해서는 1234 포트를 이용해야 한다.
문제는 이러한 방법으로는 Redis 서비스를 설정할 수 없다. 각종 서비스를 운영할때에 그 서비스에서 사용가능한 옵션들을 설정할 수 있는 위 방법으로는 이게 불가능하다. 위 방법을 이용할 경우에는 기본 설정 값이 적용된다.
또, Redis 의 경우 데이터 저장소도 별도로 지정할 수가 없다. 그냥 모든게 기본 값이다. Daemon 모드로 동작중이기 때문에 Container 를 중지하면 모든 데이터가 사라진다.
MySQL 올리기
MySQL 은 실행시에 Bash 쉘 환경변수를 인지해 값을 지정할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
~$ docker run -d -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql mysql:latest Unable to find image 'mysql:latest' locally latest: Pulling from library/mysql 2a72cbf407d6: Pull complete 38680a9b47a8: Pull complete 4c732aa0eb1b: Pull complete c5317a34eddd: Pull complete f92be680366c: Pull complete e8ecd8bec5ab: Pull complete 2a650284a6a8: Pull complete 5b5108d08c6d: Pull complete beaff1261757: Pull complete c1a55c6375b5: Pull complete 8181cde51c65: Pull complete Digest: sha256:691c55aabb3c4e3b89b953dd2f022f7ea845e5443954767d321d5f5fa394e28c Status: Downloaded newer image for mysql:latest f5f269a513be10cf423b8e20e8609095658c891c0e67e8400035d4d471814731 ~$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f5f269a513be mysql:latest "docker-entrypoint.s…" 17 seconds ago Up 15 seconds 0.0.0.0:3306->3306/tcp mysql |
현시점에서 MySQL 의 최신버전은 5.7 이다. MySQL 5.7 은 처음 설치할때에 root 를 위한 임시패스워드를 생성하는데, Docker MySQL 을 생성할경우에 root 를 위한 임시패스워드를 생성하지 않도록 해야 한다.
MySQL 이 초기화가 어떻게 이루어졌는지를 보고 싶다면 docker logs containerId 를 해보면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
2018-04-18T13:27:37.655851Z 0 [Note] InnoDB: Highest supported file format is Barracuda. 2018-04-18T13:27:37.690621Z 0 [Note] InnoDB: Creating shared tablespace for temporary tables 2018-04-18T13:27:37.690698Z 0 [Note] InnoDB: Setting file './ibtmp1' size to 12 MB. Physically writing the file full; Please wait ... 2018-04-18T13:27:37.893673Z 0 [Note] InnoDB: File './ibtmp1' size is now 12 MB. 2018-04-18T13:27:37.894474Z 0 [Note] InnoDB: 96 redo rollback segment(s) found. 96 redo rollback segment(s) are active. 2018-04-18T13:27:37.894489Z 0 [Note] InnoDB: 32 non-redo rollback segment(s) are active. 2018-04-18T13:27:37.894766Z 0 [Note] InnoDB: Waiting for purge to start 2018-04-18T13:27:37.944919Z 0 [Note] InnoDB: 5.7.21 started; log sequence number 12320213 2018-04-18T13:27:37.945049Z 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool 2018-04-18T13:27:37.945213Z 0 [Note] Plugin 'FEDERATED' is disabled. 2018-04-18T13:27:37.948263Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them. 2018-04-18T13:27:37.948531Z 0 [Warning] CA certificate ca.pem is self signed. 2018-04-18T13:27:37.949368Z 0 [Note] InnoDB: Buffer pool(s) load completed at 180418 13:27:37 2018-04-18T13:27:37.950475Z 0 [Note] Server hostname (bind-address): '*'; port: 3306 2018-04-18T13:27:37.950522Z 0 [Note] IPv6 is available. 2018-04-18T13:27:37.950533Z 0 [Note] - '::' resolves to '::'; 2018-04-18T13:27:37.950595Z 0 [Note] Server socket created on IP: '::'. 2018-04-18T13:27:37.986347Z 0 [Warning] 'user' entry 'root@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.986374Z 0 [Warning] 'user' entry 'mysql.session@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.986382Z 0 [Warning] 'user' entry 'mysql.sys@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.986451Z 0 [Warning] 'db' entry 'performance_schema mysql.session@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.986462Z 0 [Warning] 'db' entry 'sys mysql.sys@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.986472Z 0 [Warning] 'proxies_priv' entry '@ root@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.988385Z 0 [Warning] 'tables_priv' entry 'user mysql.session@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.988401Z 0 [Warning] 'tables_priv' entry 'sys_config mysql.sys@localhost' ignored in --skip-name-resolve mode. 2018-04-18T13:27:37.992669Z 0 [Note] Event Scheduler: Loaded 0 events 2018-04-18T13:27:37.992747Z 0 [Note] mysqld: ready for connections. Version: '5.7.21' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) |
참고: 초보를 위한 도커 안내서