Docker 팁 정리

모든 컨테이너 삭제하기

docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)

모든 이미지 삭제하기

docker rmi $(docker images -q)

Exit 상태의 모든 컨테이너 삭제하기

docker rm $(docker ps --filter 'status=exited' -a -q)

커맨드 내용까지 다 확인하자

docker ps -a --no-trunc

기존 네트워크에 새로 만든 컨테이너 넣기

docker network ls 
docker run -d --net network_name --name mongodb mongo
docker network inspect network_name

도커의 모든 프로세스는 포그라운드로 돌려야한다.

기본적으로 도커는 프로세스이다. 그래서 프로세스가 멈추면 도커도 자동으로 멈춘다. 예를 들어 톰캣을 백그라운드로 돌리면 포그라운드가 멈추기 때문에 프로세스자체가 종료되버린다.

startup.sh을 도커로 변경해보자.

nohup python -O /data/LogImporter.py --server game01 &
nohup python -O /data/LogImporter.py --server game02 &
nohup python -O /data/LogImporter.py --server game03 &
nohup python -O /data/LogImporter.py --server game04 &
nohup python -O /data/LogImporter.py --server gamewar01 &
nohup python -O /data/LogImporter.py --server login &

이런 경우에 도커 이미지는 하나이고 아규먼트를 받아서 그 여러개의 프로세스를 만들어야한다.

실제 어플리케이션에 하드코딩되있는 아이디 비번을 도커에서 전달받아야한다.


##### 기존 코드 
#LogDBName = "YOUR DBNAME"
#MysqlHost = "YOUR SERVERIP"
#MysqlAccount = "YOUR USERNAME"
#MysqlPassword = "YOUR PASSWORD"

##### 변경코드
import os 

LogDBName = os.environ["LogDBName"]
MysqlHost = os.environ["MysqlHost"]
MysqlAccount = os.environ["MysqlAccount"]
MysqlPassword = os.environ["MysqlPassword"]

이제 도커를 올리면 환경변수값을 가져와서 사용한다.

Dockerfile을 만들자.

Dockerfile

FROM python:2.7-stretch
MAINTAINER "brian.kim" <teamsmiley@gmail.com>

RUN apt-get update
RUN pip install mysql-python

RUN mkdir -p /data/LogImporter
COPY LogImporter /data/LogImporter

ENTRYPOINT ["python2","-O","/data/LogImporter.py", "--server" ]

빌드해서 이미지를 만들자.

cd /docker/importer && docker build –tag importer .

docker-compose를 만들자.

---
version: '3.3'

services:
  logdb:
    image: mysql:5.7
    ports:
      - "3306:3306"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - /data/mysql:/var/lib/mysql
      - ./mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf:ro

  importer-game01:
    image: importer
    restart: always
    links:
      - logdb
    depends_on:
      - logdb
    environment:
      LogDBName: DBName
      MysqlHost: HostName
      MysqlAccount: UserName
      MysqlPassword: password
    command: ["game01"]

command를 사용하여 entrypoint에 아규먼트 추가

docker compose로 올리자.

cd /docker/mysql && docker-compose up -d

확인해보자. 아규먼트가 들어갔는지가 중요

docker ps -a --no-trunc

CONTAINER ID                                                       IMAGE               COMMAND                                                             CREATED             STATUS              PORTS                    NAMES
6877a09445a022c9b70d95d4fdf7d43e5784301377c800c98c23147656b12116   importer        "python2 -O /data/LogImporter/LogImporter.py --server game01"   7 minutes ago       Up 7 minutes                                 mysql_importer-game01_1

c6552ef42dc9a39d9c8938b38fc0dc46ac18fb50776e0f9a08b0141b23651764   mysql:5.7           "docker-entrypoint.sh mysqld"                                       7 minutes ago       Up 7 minutes        0.0.0.0:3306->3306/tcp   mysql_logdb_1

game01이 잘 붙어서 성공이다.

–no-trunc : 커맨드 내용을 다 보여준다.

docker-compose를 추가하여 나머지 서버들도 분석하면된다.

도커 이미지가 완성이 되었으면 이미지로 서버에 저장했다가 서버가 고장나면 복구해서 사용한다.

현재는 도커이미지가 빌드한 곳에만 있으므로 빌드서버가 고장나면 다 날라가는것이다. 이걸 도커 hub에 올리면된다.

https://hub.docker.com 에 가입하고 로그인후 create repository 해서 리파지토리 만들고 도커 빌드를 다시 해보자. 태깅을 하는데 도커 허브에서 주는 걸로 해야한다.

본인아이디 / 저장소이름

cd /docker/importer 
docker build --tag YourId/importer .
docker login   
docker push YourId/importer

나중에 복구시에는

docker login 
docker pull YourId/importer 이러면된다.

소스코드가 바뀌면 빌드를 해서 이미지를 다시 만들어야함

Dockerfile에서 cmd와 entrypoint의 차이점

Dockerfile에서 cmd와 entrypoint를 설정할수 있다.

이미지가 로드되고 난후 바로 실행이 된다. 그런데 두 설정파일에는 차이점이 있다.

cmd는 docker run -it /bin/bash 처럼 커맨들를 추가하면 docker Dockerfile에 있는 cmd는 무시된다.

그러나 entryPoint는 아규먼트로 취급된다. entrypoint에 있는거 다하고 그 후에 “/bin/bash”를 아규먼트로 하나 추가한다.

docker run 실행시 –entrypoint를 사용하면 Dockerfile에 있는 EntryPoint는 무시된다.

추가할것

docker로 크론탭을 사용해야하나?

teamsmiley's profile image

teamsmiley

2018-06-27 00:00

Read more posts by this author