이 포스트는 2018년 1월 17일 수요일에 진행됐던 세미나 강의 영상을 시청하고 작성했습니다.
세미나 강의는 이 곳을 눌러 시청하실 수 있습니다.
노트 필기식으로 작성한 내용이기에, 존댓말을 사용하지 않은 점 참고하시기 바랍니다.
* 발표자 : 김충섭 (퍼플웍스) 님
도커 설치하기
Linux
1 | curl -s https://get.docker.com/ | sudo sh |
Mac or Windows
Docker for Mac / Docker for Windows 설치
- Windows 의 경우…
- Switch to Linux containers 를 눌러 Linux Container 로 변경.
- 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 | docker run -d \ |
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 | docker run -d \ |
- 위 명령어를 작성하여 실행한 컨테이너를 종료하거나 삭제하지 않는다면 기존 v2 에서 4568이라는 포트를 사용중이기때문에, 동일한 포트를 입력하면 실행이 되지 않는다.
Redis
Redis 는 메모리 기반의 다양한 기능을 가진 스토리지
1 | docker run --name=redis -d -p 1234:6379 redis |
위 Redis 컨테이너를 실행하고나서 확인해보는 방법은 Telnet으로 하면 되며
Telnet 테스트는 흔히 아는 ‘그 Telnet’을 사용하거나,
그마저도 컨테이너로 올려 실행하고 싶다면 이 분의 이미지를 활용하면 된다.
아래 2가지 방법 중 플랫폼에 맞춰 코드를 작성해본다.
1 | macOS |
그럼 아래와 같은 내용이 나올 것이다
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 | run : 컨테이너를 실행만 한다. 실행 이후 추가 명령어를 입력할 일이 없을 때 주로 사용한다. |
TIP : docker run 과 exec
- exec : run 명령어와는 달리, 컨테이너에 접속할 때 사용하며 일반적으로 컨테이너 안에 SSH Server 등을 설치하지 않고 접속한다.
Wordpress
1 | docker run -d -p 8080:80 \ |
정상적으로 실행이 된다면, localhost:8080 를 브라우저에 입력하여 접속해본다.
처음 실행된 것이라면 초기 환경 설정 화면이 나올 것이다.
Tensorflow
손쉽게 머신러닝을 할 수 있는 툴이다. Python과 Tensorflow와 관련된 라이브러리를 별도로 설치하지 않더라도 가능.
1 | docker run -it -p 8888:8888 tensorflow/tensorflow |
그 이외의 명령어
ps
1 | 실행중인 또는 정지된 컨테이너 목록 확인 |
stop
1 | 컨테이너 중지하기 |
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 | docker stop c1 e1 |
rm
현재 중지된 컨테이너를 제거한다.
중지 상태와 제거 상태는 엄밀히 다르다
중지 상태는 컨테이너 실행을 일시정지하는 것으로 생각하고, 제거상태는 저장된 컨테이너를 제거하는 것으로 생각하면 이해가 쉬울 것이다.
1 | 사용 예시 |
logs
컨테이너의 로그를 직접 확인할 수 있다.
1 | docker logs [CONTAINER ID] |
- -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 | docker network create [OPTIONS] NETWORK |
network connect
- 기존에 생성된 컨테이너에 네트워크를 추가한다.
1 | docker network connect [OPTIONS] NETWORK CONTAINER |
run with network
- WordPress를 app-network에 속하도록하고, 이에 대한 DB는 mysql에서 가져다 쓸 수 있도록 한다.
1 | docker run -d -p 8080:80 \ |
Volume Mount
-v 옵션
- 호스트 OS의 볼륨과 실제로 연동하도록 작업할 수 있다. (컨테이너의 볼륨이 시스템 볼륨의 지정 위치와 동기화하여 작동한다.)
- DB 또는 DBMS 등 휘발적인 사용이 권장되지 않는 환경에서 주로 사용된다.
Docker Compose
Docker for Mac / Windows 환경은 Docker Compose가 자동으로 설치되어 있다.
docker-compose.yaml 파일 작성
다음은 mysql, wordpress 컨테이너를 다수의 명령어 없이 일일히 작성하는 파일 방식이다.
이 방법은 선언 방법이라고 한다.
1 | version: '2' |