0%

T아카데미 토크ON세미나 19차 '컨테이너 기반 가상화 플랫폼 도커(Docker)의 이해' : 2강 도커 컨테이너 만들기

이 포스트는 2018년 1월 17일 수요일에 진행됐던 세미나 강의 영상을 시청하고 작성했습니다.
세미나 강의는 이 곳을 눌러 시청하실 수 있습니다.

노트 필기식으로 작성한 내용이기에, 존댓말을 사용하지 않은 점 참고하시기 바랍니다.

* 발표자 : 김충섭 (퍼플웍스) 님


도커 설치하기

Linux

1
curl -s https://get.docker.com/ | sudo sh

Mac or Windows

Docker for Mac / Docker for Windows 설치

  • Windows 의 경우…
    1. Switch to Linux containers 를 눌러 Linux Container 로 변경.
    2. Docker 옵션 창에서 Expose daemon on tcp://localhost … 찾아 클릭

MacOS 는 xhyve를 사용, Windows 는 Hyper-V 사용

wgtech 추가 코멘트) 특히 Windows 사용자들은 조심해야할 점은, Virtualbox이 설치된 환경인 경우이다.
Virtualbox도 Hyper-V를 점유하기 때문에, Virtualbox를 삭제해야할 것을 권장한다.


설치 완료 후 확인하기

1
docker version

컨테이너 실행하기

‘run’ command

ubuntu

1
docker run ubuntu:16.04
  • 그러나 실행 이후 Process 가 바로 종료된다. 그래서 컨테이너 내부의 Shell 을 따로 실행해줘야한다.

따라서 이번엔, 별도 command를 추가하여 실행해보자.

1
docker run --rm -it ubuntu:latest /bin/sh

/bin/sh 을 사용하면, 컨테이너 내부에서 Shell이 실행된다.

TIP : –rm 옵션과 -it 옵션

  • –rm : 컨테이너가 종료하면, 컨테이너는 즉시 삭제한다.
    (이 옵션을 지정하지 않으면, 프로세스에 남아 있으며 일일히 docker rm 로 컨테이너를 삭제해야한다.)
  • -it : Interactive, 명령어 입력 가능 상태로 전환

CentOS

1
docker run --rm -it centos:7 /bin/sh

ubuntu 실행 예시처럼,
CentOS 7 버전의 이미지를 내려받아 컨테이너로 run 시키면서 Shell 을 실행하도록 초기화한다.
그리고, 실행한 컨테이너를 종료하면 자동으로 그 컨테이너가 제거된다.


Web Application v2

다음은 발표자님께서 작성하신 애플리케이션을 활용하며 컨테이너를 올려보자.

1
2
3
4
5
docker run -d \
-p 4568:4567 \
-e ENDPOINT=https://workshop-docker-kr.herokuapp.com/ \
-e PARAM_NAME=haha \
subicura/docker-workshop-app:2

TIP : 코드 속 설명

  • \ : 명령어의 끝이 아님을 알린다.
  • -d : 실행된 상태로 멈춤
  • -p : 4568 포트로 컨테이너 4567 포트로 연결. (외부 4568 → 컨테이너 4567)
  • -e : 환경 변수 지정.
  • subicura/docker-workshop-app:2 : subicura 라는 이름의 Docker Hub 계정이 보유한, docker-workshop-app 라는 이미지의 ‘2’라는 태그를 의미하며, 이에 해당되는 이미지를 가리킨다.

Web Application v3

위에 내용과는 조금 다르게, 버전3 애플리케이션을 활용해본다.

1
2
3
4
5
6
docker run -d \
-p 4569:4567 \
-e ENDPOINT=https://workshop-docker-kr.herokuapp.com/ \
-e PARAM_NAME=haha \
-e PARAM_MESSAGE=호호호 \
subicura/docker-workshop-app:3
  • 위 명령어를 작성하여 실행한 컨테이너를 종료하거나 삭제하지 않는다면 기존 v2 에서 4568이라는 포트를 사용중이기때문에, 동일한 포트를 입력하면 실행이 되지 않는다.

Redis

Redis 는 메모리 기반의 다양한 기능을 가진 스토리지

1
docker run --name=redis -d -p 1234:6379 redis

위 Redis 컨테이너를 실행하고나서 확인해보는 방법은 Telnet으로 하면 되며
Telnet 테스트는 흔히 아는 ‘그 Telnet’을 사용하거나,
그마저도 컨테이너로 올려 실행하고 싶다면 이 분의 이미지를 활용하면 된다.
아래 2가지 방법 중 플랫폼에 맞춰 코드를 작성해본다.

1
2
3
4
5
# macOS
docker run --rm -it mikesplain/telnet docker.for.mac.localhost 1234

# Windows
docker run --rm -it mikesplain/telnet docker.for.win.localhost 1234

그럼 아래와 같은 내용이 나올 것이다

Unable to find image ‘mikesplain/telnet:latest’ locally
latest: Pulling from mikesplain/telnet
c52e3ed763ff: Pull complete
a3ed95caeb02: Pull complete
Digest: sha256:11fa2b96776f5d34511452ad2b76eafad69321e456ac6653482eadb9d98c52a7
Status: Downloaded newer image for mikesplain/telnet:latest

곧 이어 아무런 반응이 나오지 않는다면 다음과 같은 명령어를 입력하면서 상태를 확인해본다.

keys * *0
SET hello world
+OK
GET hello
$5
world


MySQL

1
2
3
4
5
6
7
8
# run : 컨테이너를 실행만 한다. 실행 이후 추가 명령어를 입력할 일이 없을 때 주로 사용한다.
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7

# exec : 컨테이너가 running 상태라면, 입력된 추가 명령어를 담아 컨테이너에 직접 접근하여 명령을 수행한다.
docker exec -it mysql mysql

TIP : docker run 과 exec

  • exec : run 명령어와는 달리, 컨테이너에 접속할 때 사용하며 일반적으로 컨테이너 안에 SSH Server 등을 설치하지 않고 접속한다.

Wordpress

1
2
3
4
5
6
docker run -d -p 8080:80 \
-e WORDPRESS_DB_PASSWORD=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_HOST=docker.for.mac.localhost \
wordpress

정상적으로 실행이 된다면, localhost:8080 를 브라우저에 입력하여 접속해본다.
처음 실행된 것이라면 초기 환경 설정 화면이 나올 것이다.


Tensorflow

손쉽게 머신러닝을 할 수 있는 툴이다. Python과 Tensorflow와 관련된 라이브러리를 별도로 설치하지 않더라도 가능.

1
docker run -it -p 8888:8888 tensorflow/tensorflow



그 이외의 명령어

ps

1
2
3
4
5
# 실행중인 또는 정지된 컨테이너 목록 확인
docker ps

# 모든 컨테이너들 각각의 상태(실행, 중단 등의 현재 상태)들을 체크할 수 있다.
docker ps -a

stop

1
2
# 컨테이너 중지하기
docker stop [CONTAINER ID]

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c1ae9b80e569 redis “docker-entrypoint.s…” 14 minutes ago Up 14 minutes 0.0.0.0:1234->6379/tcp redis
e12f3405413c subicura/docker-workshop-app:2 “/bin/sh -c ‘bundle …” 24 minutes ago Up 24 minutes 0.0.0.0:4568->4567/tcp suspicious_jones

현재 Running인 Docker 컨테이너 c1ae9b80e569, e12f3405413c 를 중지하고 싶다면

1
2
3
4
5
6
docker stop c1 e1

#또는
docker stop c1ae9b80e569 e12f3405413c
docker stop c1ae9b80e569 && docker stop e12f3405413c
...

rm

현재 중지된 컨테이너를 제거한다.
중지 상태와 제거 상태는 엄밀히 다르다
중지 상태는 컨테이너 실행을 일시정지하는 것으로 생각하고, 제거상태는 저장된 컨테이너를 제거하는 것으로 생각하면 이해가 쉬울 것이다.

1
2
3
# 사용 예시
docker ps -a # 중지된 컨테이너 확인
docker rm 7a 0d c1 e1 c8

logs

컨테이너의 로그를 직접 확인할 수 있다.

1
2
3
docker logs [CONTAINER ID]

docker logs -f b62
  • -f : 새로 생성된 로그를 실시간으로 확인 할 수 있다.

images

현재 Docker 시스템에 설치된 이미지 목록 확인할 수 있다.

1
docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
wordpress latest 5e5e0b1aa9dd 7 days ago 447MB
ubuntu latest 4c108a37151f 7 days ago 64.2MB
redis latest 3c41ce05add9 2 weeks ago 95MB
mysql 5.7 a1aa4f76fab9 2 weeks ago 373MB
mysql latest c7109f74d339 2 weeks ago 443MB
wgtech/notebook django ee465632331e 4 weeks ago 903MB
centos latest 9f38484d220f 3 months ago 202MB
subicura/docker-workshop-app 2 0fe78e486e9f 17 months ago 299MB
mikesplain/telnet latest 16a7ed249fe6 3 years ago 4.79MB


pull

Docker Hub와 같은 Docker Registry 등에서 이미지를 내려받는다.

1
docker pull ubuntu:latest

rmi

현재 시스템에 설치된 이미지를 삭제한다.

1
docker rmi mysql
  • 실행중인 이미지는 삭제되지 않는다. 컨테이너는 이미지를 기반으로 생성되기 때문이다.

컨테이너는 이미지로부터 파생된 것이다. 컨테이너가 실행되어 있으면 그 컨테이너가 영향 받은 이미지는 제거가 불가능하다



네트워크 만들기

network create

  • 도커 컨테이너끼리 통신할 수 있는 가상 네트워크를 만든다.
1
2
3
4
5
6
7
8
9
10
docker network create [OPTIONS] NETWORK

# 이번 실습은, Wordpress 컨테이너와 MySQL 컨테이너가 통신할 네트워크를 만들어본다.
docker network create app-network

# 첫번째 컨테이너 생성 후 네트워크 연동
docker run --name=ubuntu -it --network=app-network ubuntu /bin/sh

# 두번째 컨테이너 생성 후 네트워크 연동
docker run --name=ubuntu2 -it --network=app-network ubuntu /bin/sh

network connect

  • 기존에 생성된 컨테이너에 네트워크를 추가한다.
1
2
3
docker network connect [OPTIONS] NETWORK CONTAINER

docker network connect app-network mysql

run with network

  • WordPress를 app-network에 속하도록하고, 이에 대한 DB는 mysql에서 가져다 쓸 수 있도록 한다.
1
2
3
4
5
6
docker run -d -p 8080:80 \
-e WORDPRESS_DB_HOST=**mysql** \
-e WORDPRESS_DB_NAME=wp \
-e WORDPRESS_DB_USER=wp \
-e WORDPRESS_DB_PASSWORD=wp \
wordpress

Volume Mount

-v 옵션

  • 호스트 OS의 볼륨과 실제로 연동하도록 작업할 수 있다. (컨테이너의 볼륨이 시스템 볼륨의 지정 위치와 동기화하여 작동한다.)
  • DB 또는 DBMS 등 휘발적인 사용이 권장되지 않는 환경에서 주로 사용된다.



Docker Compose

Docker for Mac / Windows 환경은 Docker Compose가 자동으로 설치되어 있다.

docker-compose.yaml 파일 작성

다음은 mysql, wordpress 컨테이너를 다수의 명령어 없이 일일히 작성하는 파일 방식이다.
이 방법은 선언 방법이라고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '2'
services:
db:
image: mysql:5.7
volumes:
- ./mysql:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
image: wordpress:latest
volumes:
- ./wp:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_PASSWORD: wordpress