Notice
Recent Posts
Recent Comments
Today
Total
04-27 06:07
Archives
관리 메뉴

Jeongchul Kim

Docker run 명령어 in AWS EC2 본문

Docker

Docker run 명령어 in AWS EC2

김 정출 2018. 11. 21. 15:03


Docker run 명령어 in AWS EC2


Dokcer AWS EC2 설치[http://jeongchul.tistory.com/611]

docker login

현재 터미널 bash에서 docker hub에 로그인하여 image를 pull 또는 push 할 수 있습니다.

docker run

docker run은 독립된 container를 실행합니다. container는 프로세스(process)로 host 위에서 동작합니다. host는 로컬(local)에 있거나 원격(remote)에 있을 수 있습니다. run으로 container를 실행하면 독립된 파일 시스템(file system)과 네트워킹 그리고 프로세스 트리를 가지게 됩니다.

https://docs.docker.com/engine/reference/run/


$ docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

- docker run은 container의 IMAGE가 필히 들어가야 합니다.


Options

1. Detached (-d) : 많이 쓰이는 옵션입니다. container를 background에서 실행하고 싶다면 사용됩니다.

머신러닝 개발이라면 jupyter를 많이 사용하실 겁니다. scikit-learn이 설치된 notebook을 이용해봅시다.


mongodb(https://www.mongodb.com/) NoSQL 많이 사용하실텐데 background로 container를 동작 시켜봅시다.

https://hub.docker.com/_/mongo/

$ docker run -d --name mongodb mongo


현재 동작 중인 docker container를 확인할 수 있습니다.

$ docker ps


mongodb의 mongo shell로 접속해봅시다.

$ docker exec -it mongodb mongo


2. Foreground

 - container에 표준입력, 출력, 에러 연결하기 (-a): STDIN(-a stdin), STDOUT(-a stdout), STDERR(-a stderr)를 연결합니다.

 - STDIN (-i) : STDIN을 attach가 되지 않더라도 open을 유지합니다.

 - 터미널 연결(pseudo-tty) (-t) : command line을 실행하기 위해 TTY를 할당합니다.

 - shell과 같은 Interactive process에서는 tty를 할당하기 위해서 -it를 함께 사용해야 합니다.


자 이번에는 ubuntu를 official 이미지를 이용해 container로 만들어봅시다.

https://hub.docker.com/_/ubuntu/

-it 옵션을 이용해 ubuntu 19.04 으로 생성된 container의 터미널에 바로 접속하신 것을 볼 수 있습니다.

$ docker run -it --name ubuntu ubuntu:19.04

# apt update


3. Name (--name CONTAINER_NAME) : container에 특정 이름을 부여합니다.

4. Clean up (--rm) : container는 종료된 이후에도 파일 시스템이 남아있습니다(persist). container를 짧게 foreground 프로세스로 사용되고 종료되는 경우에 자동적으로 container의 file system을 지우고 정리하고 싶다면 사용하면 좋습니다.


$ docker run -it --rm busybox


종료가 된 목록을 살펴봅시다.

$ docker ps -a

5. Network Settings

 - Container 네트워크 설정 방법 (--network) : 가능한 옵션으로 bridge, none, host 등이 있습니다.

 - /etc/hosts에 추가하기 (--add-hosts HOST:127.0.0.1) : docker network, docker swarm을 통해서 hadoop, spark cluster 생성 시에 사용했었습니다.


6. Restart policies (--restart) : container가 종료되었을 때 재시작 정책입니다.

 - no : default 값으로 종료가되면 자동으로 재시작되지 않습니다. --restart “no”

 - on-failure:N : container가 non-zero로 종료된 상태라면 재시작합니다. 몇 번 재시작을 retry 할지 N을 선택할 수 있습니다.  --restart=”on-failure:3”

 - always : exit 상태와 상관없이 무조건 다시 재시작됩니다.


$ docker run -it --name busybox1 busybox

$ docker run -it --name busybox2 --restart=always busybox

restart 옵션을 이용해 계속 container가 살아 있는 것을 볼 수 있습니다.

$ docker ps -a


7. Resource Allocation : container에 자원 할당을 합니다.

 - 메모리 제한 (--memory NUMBER[UNIT]) : container의 메모리 크기를 설정합니다. [UNIT]은 b, k, m, g 이며, 최소 4M은 되야 합니다. -m 2g

 - 메모리 스왑 (--memory-swap NUMBER[UNIT]) : container의 메모리 swap 영역 크기를 설정합니다. 전체 메모리는 memory + swap 입니다.

 - CPU 설정 (--cpu-shares) : CPU를 상대적인 weight 값으로 공유합니다.

 - CPU의 양 설정 (--cpus FLOAT) : CPU를 fractional number로 지정합니다. --cpus=0.000 제한이 없음

 - CPU CFS(Completely Fair Scheduler) period 설정 (--cpu-period) : --cpu-period=0


$ docker run -dit --name ubuntu -m 500M ubuntu:16.04 /bin/bash

$ docker ps -a

$ docker stats


예로 다음을 실행해봅시다.

$ docker run busybox echo “Hello world”


$ docker run -a stdin -a stdout -it ubuntu /bin/bash


8. CMD와 ENTRYPOINT(--entrypoint)

 - CMD는 Docker image 개발자가 작성한 Dockerfile에 있는 CMD에 저장된 값이 기본값으로 실행되며, CMD를 오버라이드(override) 할 수 있습니다.

 - ENTRYPOINT 또한 DockerFile에 작성된 ENTRYPOINT가 기본값으로 실행되며 새로운 ENTRYPOINT로 실행 가능합니다.


이번에는 redis를 실행해봅시다.

https://hub.docker.com/_/redis/

$ docker run -it --entrypoint /bin/bash redis


9. EXPOSE host와 container의 포트(port)를 연결합니다.

- 전체 포트(-P) : 호스트(host) 인터페이스에 전체 포트를 오픈합니다.

- 특정 포트(-p) : HOST_PORT:CONTAINER_PORT 로 정의합니다. 서로 연결할 호스트와 컨테이너의 포트를 순서대로 작성합니다.


이번엔 scikit-learn이 설치된 jupyter를 실행해봅시다. port는 8888로 연결하겠습니다.

$ docker run -p 8888:8888 --name ipython jupyter/scipy-notebook

https://hub.docker.com/r/jupyter/scipy-notebook/


실행 중인 jupyter에 접속을 하기 위해서는 EC2의 port를 관리하는 Security Groups에서 설정해야 합니다.


EC2에 연결된 Security Group을 클릭해 inbound rules에서 TCP 8888포트를 0.0.0.0/0으로 설정합니다.

자 이제 AWS EC2 dashboard에서 public ip를 확인해주세요

http://[AWS-EC2-PUBLIC-IP]:8888



10. ENV 환경 변수(-e)

Docker는 container가 생성될 때 자동적으로 환경 변수를 세팅합니다.

- HOME : USER의 값에 기반하여 세팅합니다.

- HOSTNAME : container의 hostname을 설정

- PATH : 환경 설정 변수로 경로를 지정합니다. /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin


11. VOLUME 공유 파일 시스템(shared filesystems) (-v, --volume)

호스트의 파일 시스템을 container의 파일 시스템에 연결합니다.

- HOST-SRC:CONTAINER-DEST을 이용해 파일을 공유할 수 있습니다.


공유할 파일과 디렉토리를 local에서 만들어봅시다.


-v 옵션을 줘서 공유 파일 시스템을 만들어봅시다.

$ docker run -it --name ubuntu -v ~/workspace/:/workspace ubuntu:16.04


12. USER (-u, --user)

container의 기본적인 user는 root입니다. 특정 유저를 설정하고 싶다면 다음의 옵션을 사용하면 됩니다.


13. WORKDIR (-w)

container가 작업하는 디렉토리는 / root  폴더입니다. 작업하는 디렉토리를 다른 경로(path)로 줄 수 있습니다.







'Docker' 카테고리의 다른 글

Portainer.io  (0) 2020.02.24
Docker network 네트워크  (2) 2019.07.26
Docker AWS EC2 설치  (3) 2018.11.20
Google Cloud with Docker  (0) 2018.03.06
An Updated Performance Comparison of Virtual Machines and Linux Containers  (0) 2017.07.07
Comments