본문 바로가기

Back-end

[Server] Docker 정리

Docker 정리

도커 기초 명령어

# docker hub
# repo .
docker pull repo:tag
# .
docker images
#
docker run -i -t --name myredis -d redis

-i = interactive
-t = tty
-d = run as background

상단에서 redis는 클래스 같은 내용이며 myredis는 인스턴스와 비슷한 개념으로 도커에서는 컨테이너라 부른다.

#
docker ps
#
docker ps -a
#
docker stop or

bash로 접속

docker exec -it <container name or id> /bin/bash

컨테이너 삭제

docker rm <container name>
docker rmi <image name>:<tag>

정리

도커 이미지는 클래스처럼 설계도와 같은 역활을한다
docker start container-name 으로 해당 이미지 토대의 컨테이너를 만들어내고 docker logs -ft container-name으로 로그도 확인할 수 있다.

도커 메모리

docker run -ti --c 1024 ubuntu:10.04 /bin/bash
docker run -ti --c 512 dabian:5.55 /bin/bash

위처럼 하면 컨테이너1의 메모리 가중치가 1024
컨테이너2가 512가 된다. 그러면 컨테이너1은
1024/1536만큼의 메모리를 그리고 컨테이너2는 512/1535
만큼의 가중치를 갖는다.

스왑 메모리

# 300m
docker run -ti -m 300M ubuntu:16.04 /bin/bash
docker run -ti -m 300M --memory-swap 1G ubuntu:16.04 /bin/bash

docker deep drive

docker kill $(docker ps -q)

모든 컨테이너를 종료한다. 인자값을 받아 넣는식이 가능

docker rm $(docker ps -a -q)

정지된 것을 포함 모든 컨테이너 삭제

#1
docker ps -a | grep 'weeks ago'| awk '{print $1}'|xargs docker rm
#
docker rm -v $(docker ps -a -q -f status=exited)
#
docker rmi $(docker images -q -f dangling=true)
#
docker volume rm $(docker volume ls -q dangling=true)

파일시스템을 통한 도커

#image
docker load < my_iamge.tar.gz
docker save my_iamge:my_tag > my_image.tar.gz
#container
cat my_container.tar.gz | docker import - my_image:my_tag
docker export my_container > my_container.tar.gz

모니터링

docker stats <containers>
docker stats $(docker ps -q)
#ubuntu image
docker ps -a -f ancestor=ubuntu

이미지 빌드

docker commit 명령어
dockerfile -> docker build 명령어

도커 변동사항을 이미지로 만들고싶다면
docker commmit -m="message" --autor="authorname" containerId dockerhubId/repo:tag

도에 .dockerignore를 만들어 gitignore같이 커밋하지 않을 파일을 설정할 수 있다.

Dockerfile

첫줄부터 차례로 실행되며 한라인이 실행될때마다
이미지에 레이어가 추가된다. 실행중 에러시 에러가 난 곳부터

#
FROM ubuntu:16.10
#author
MAINTAINER harry <herryhan2435@gmail.com>
# Run command bash .
# Line by Line step number .
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:12341234' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# ssh login fix
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
#
ENV NOTVISIBLE "in user profile"
RUN echo "export VISIBLE=new" >> /etc/profile
## 22
EXPOSE 22
CMD ["/user/sbin/sshd", "-D"]
#ssh -D()

history,port,cache

# docker
docker build -t "author/repo"
#port
docker port container 22
# docker
docker inspect --format '{{ .NetworkSettings.IPAddress }}' test_sshd
# --no-cache
#
docker build --no-cache
#
# 22 22
#
docker run -d -p 22:22 --name test harry/repo
# /
docker stop test1 test2 test3
docker rm test1 test2 test3

환경변수

** ENV **
** ENV = **

FROM ubuntu:16.04
ENV foo/bar
WORKDIR ${foo} #foo = /bar
ADD . $foo # bar .
COPY \$foo /quux # /bar /quux

CMD

CMD는 컨테이너가 생성될 때 실행된다.
도커파일에는 하나의 CMD가 실행된다.
RUN은 각 명령어 실행될 때 마다 COMMIT 된다.
CMD는 build 시점에는 실행이 되지 않으며 RUN 할때 실행된다.

docker run image -D

위와같이 D 명령어를 줄경우 기존의 CMD내용을 override하게된다.

WORKDIR

workdir의 경우 -w옵션으로 오버라이딩 가능하다.

VOLUME

호스트와 공유할 디렉토리 설정

# VOLUME Host container
VOLUME /data1 /data2

ADD

add를 통해 파일을 복사하거나 파일을 가져올 수 있다.

ADD hom* /mrdir/
ADD hom?.txt /mydir/
ADD test dir/
ADD http://url.com/foo.zip /dir/boo.zip
ADD foo.tar.gz /mydir/

url은 인증이 필요하다면 사용을 할 수 없다.

COPY

ADD 와 비슷하지만 압축해제와 같은 기능 그리고 외부에서 다운로드 하는 기능이 없다.
context 외부 디렉토리를 참조할 수 없다.

docker-compose

다수의 docker iamge를 제어할 수 있다.

$ docker-compose up #
$ docker-compose stop #
$ docker-compose ps #check

docker-compose 리스트

인자 설명
image 사용할 이미지
env_file ghksrudqustn vkdlf
dockerfile 사용할 dockerfile
command 기본 커맨드의 새로운 값을 override 한다
port 사용포트
links 연결할 다른 컨테이너
dns 컨테이너 dns 주소

wordpress example

#docker-compose.yml
version:'2'
sevvices:
wordpress:
image:wordpress
ports:
-8080:80 #host:container
enviroment:
WORDPRESS_DB_PASSEORD:1234
mysql:
image:mariadb
enviroment:
MYSQL_ROOT_PASSWORD:1234

위 파일을 만들어 준 후

docker-compose up