Mutable -> Ansible, Chef, Puppet
Immutable -> Docker
gitHub : 소스
빌드 서버 (CI 서버) : 도커 이미지 생성
도커 레지스트리 : 도커 이미지 저장
Mesos (-> 쿠버네틱스로 대체 중) : Container Orchestration. 서버에 컨테이너 여러개를 띄워야 할 때, 자원이 남는 서버에 배치. 로드 밸런싱. 장애 복구. Ephemeral node
curl -fsSL https://get.docker.com/ | sudo sh
docker version # 설치 확인
Error response from daemon: Bad response from Docker engine
와 같은 오류가 나면 docker daemon이 제대로 안뜨거나 sudo로 설치하지 않은 것
- 실행시 sudo 없이 특정 유저에게 권한 부여
sudo usermod -aG docker $USER
docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
-d : detached mode 흔히 말하는 백그라운드 모드
-p : 호스트와 컨테이너의 포트를 연결 (포워딩)
-v : 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e : 컨테이너 내에서 사용할 환경변수 설정
–name : 컨테이너 이름 설정
–rm : 프로세스 종료시 컨테이너 자동 제거
-it : -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
–link : 컨테이너 연결 [컨테이너명:별칭]
docker ps [OPTIONS]
-a : 종료되었으나 삭제되지 않은 컨테이너도 보여준다
—all
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker ps -a -q | xargs docker stop
docker rm [OPTIONS] CONTAINER [CONTAINER...]
docker rm -v $(docker ps -a -q -f status=exited)
docker images [OPTIONS] [REPOSITORY[:TAG]]
docker rmi [OPTIONS] IMAGE [IMAGE...]
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker logs [OPTIONS] CONTAINER
-f, —tail 옵션
docker logs --tail 10 ${CONTAINER_ID}
docker logs -f ${CONTAINER_ID}
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it mysql /bin/bash
docker exec -it mysql mysql -uroot
docker attach my_container
docker cp hello-nginx:/etc/nginx/nginx.conf ./
docker diff my_container
docker run --rm ubuntu:16.04
docker run --rm -it ubuntu:16.04 /bin/bash
docker run --rm -d -p 1234:6379 redis
telnet localhost 1234
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
mysql:5.7
e 옵션 -> 환경변수
name 옵션 -> 76a5f... 이런 어려운 아이디 말고 읽기 쉬운 랜덤한 이름 부여
docker run -d -p 8888:8888 -p 6006:6006 teamlab/pydata-tensorflow:0.1
-v /my/own/datadir:/var/lib/mysql
docker run -d -p 3306:3306 \
-e MYSQL_ALLOW_EMPTY_PASSWORD=true \
--name mysql \
-v /my/own/datadir:/var/lib/mysql \ # <- volume mount
mysql:5.7
curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# test
docker-compose version
docker-compose up
FROM ubuntu:16.04
RUN bundle install
ENV <key> <value>
ENV <key>=<value> ...
ENV DB_URL mysql
COPY <src>... <dest>
COPY . /usr/src/app
CMD bundle exec ruby app.rb
EXPOSE 4567
VOLUMN ["/dtata"]
RUN vs CMD vs ENTRYPOINT
RUN : 레이어를 만듬
CMD : 기본 명령어, overriding 가능
ENTRYPOINT : docker 실행시 실행되는 명령어
COPY . /usr/src/app
RUN bundle install
RUN bundle install # 다음 빌드시 재사용 가능하게
COPY . /usr/src/app
Dockfile이 있는 디렉토리에서
docker build -t ${NAME_TAG} .
docker run -d -p 9999:80 ${NAME_TAG}
docker run -d -p -it 9999:80 ${TAG} /bin/bash
[Registry URL]/[사용자 ID]/[이미지명]:[tag]
docker login
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag app subicura/sinatra-app:1
docker push subicura/sinatra-app:1
docker swarm init --advertise-addr 172.17.8.101
docker service create \
--name my-web \
--publish published=8080,target=80 \
--replicas 2 \
nginx
노드들의 목록 확인
docker node ls
docker service create --name [SERVICE_NAME] \
-p 4567:4567 [IMAGE_NAME]
서비스 목록 확인
docker service ls
나 docker service ps [SERVICE_NAME]
core-01:4567 에만 떠있더라도 core-02:4567, core-03:4567 등 클러스터의 모든 노드에 요청 가능하며 routing mesh가 알아서 사용 가능한 core-01:4567로 호출하여 리턴한다.
docker service scale [SERVICE_NAME]=5
docker service create --name redis \
--network=backend redis
docker pull registry
docker run --name personal-registry -d -p 5000:5000 registry
docker tag nacyot/hello_docker 0.0.0.0:5000/hello_docker
docker push 0.0.0.0:5000/hello_docker