docker를 삽질하면서 알게된것 정리

Docker 설치

‣ 의 Docker 설치 참고

Docker 명령어

docker pull ubuntu:latest
docker images
docker ps -a
docker start hello
docker restart hello
docker attach hello (컨트롤 p,q 누르면 정지하지 않고 빠져나옴)
docker exec hello echo "Hello"
docker stop hello
docker rm hello
docker rmi ubuntu:latest

docker run \\
	-it -d \\ # 표준 입출력 , 데몬으로 (컨트롤 p q 로 빠져오기 가능)
	--rm \\ # 컨테이너 종료시 삭제
	--gpus all \\ # 그래픽카드 전체 사용 (nvidia-docker2 가 있어야함)
	--name hello \\ # 컨테이너 이름 설정
	--user 1000 \\ # 유저 id 1000으로 설정
	--link hellodb:db \\ # db라는 컨테이너를 db라는 별칭으로 연결함 (db를 dns처럼 사용)
	--network hello-network \\ # hello-network 네트워크에 연결
	-p 7080:80 \\ # 호스트 포트 7080에 컨테이너 80 포트 연결 (컨테이너 이름을 dns 처럼 사용)
	-v $(PWD):/home \\ # 호스트 현재 디렉토리에 컨테이터 /home 디렉토리 연결
	hello:0.1 # 사용할 이미지:태그

docker cp <컨테이너 이름>:<경로> <호스트 경로>
docker cp hello-nginx:/etc/nginx/nginx.conf ./

hello-nginx 컨테이너 안의 파일 내용이 바뀌었다고 치고, 컨테이너를 이미지 파일로 생성해보겠습니다.
docker commit <옵션> <컨테이너 이름> <이미지 이름>:<태그>
docker commit -a "Foo Bar <[email protected]>" -m "add hello.txt" hello-nginx hello:0.2

docker build -t hello:0.1 -f Dockerfile.dev .
docker build -t hello:0.1 .

docker diff hello-nginx
docker inspect hello-nginx

docker network create hello-network
docker run --name db -d --network hello-network mongo
docker run --name web -d -p 80:80 --network hello-network nginx

docker stats

Dockerfile

# 이미지 파일
FROM ubuntu:14.04

# app 디렉토리 생성
RUN mkdir -p /app

#Docker 이미지 내부에서 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉터리를 설정합니다.
WORKDIR /app

# 현재 디렉터리에 있는 파일들을 이미지 내부 /app 디렉터리에 추가함
ADD     . /app

# 환경변수 추가 , 설치시 상호작용 끄기
ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update \\
	&& apt-get install -y apache2
RUN service apache2 start

VOLUME ["/data", "/var/log/httpd"]

# 하기 포트를 외부로 노출합니다.
EXPOSE 80

# 컨테이너가 시작되었을 때
# 해당 명령어가 종료되면 컨테이너도 종료됨
ENTRYPOINT "/app/log.backup.sh"

# run 할때 default 명령어
CMD "/bin/bash"
CMD ["/bin/bash", "-c", "nvidia-smi"]

Docker Compose 설치

sudo curl -L "<https://github.com/docker/compose/releases/download/1.28.2/docker-compose-$>(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version

Install Docker Compose

Docker Compose 명령어

docker-compose up -d
docker-compose -f docker-compose-local.yml up -d
docker-compose down
docker-compose start web
docker-compose stop web
docker-compose ps
docker-compose logs -f web
docker-compose exec db /bin/bash
docker-compose run web pwd

Docker Compose

version: '2.1'
volumes:
  django_sample_db_dev: {}
  django_sample_packages: {}

services:
  db:
    image: postgres:9.6.1
    volumes:
      - django_sample_db_dev:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=sampledb
      - POSTGRES_USER=sampleuser
      - POSTGRES_PASSWORD=samplesecret
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8
    healthcheck:
      test: "pg_isready -h localhost -p 5432 -U postgres"
      interval: 3s
      timeout: 1s
      retries: 10

  django:
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile-dev
    environment:
      - DJANGO_DEBUG=True
      - DJANGO_DB_HOST=db
      - DJANGO_DB_PORT=5432
      - DJANGO_DB_NAME=sampledb
      - DJANGO_DB_USERNAME=sampleuser
      - DJANGO_DB_PASSWORD=samplesecret
      - DJANGO_SECRET_KEY=dev_secret_key
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    links:
      - db
    command: /start-dev.sh
    volumes:
      - ./manage.py:/app/manage.py
      - ./requirements.txt:/app/requirements.txt
      - ./requirements-dev.txt:/app/requirements-dev.txt
      - ./djangosample:/app/djangosample
      - django_sample_packages:/usr/local/lib/python3.6/site-packages/
networks:
  our_net:
    driver: bridge
	default:
	    external:
	      name: our_net

삽질