출처: [book]완벽한 IT 인프라 구축을 위한 Docker 책 내용을 기반으로 공부하며 정리한 것입니다.
#1. docker version 확인
$docker version
#2. docker 실행환경 확인
$docker system info
#3. docker 가 사용하고 있는 disk 이용 상황
$docker system df
#4. docker image 목록 확인
$docker image ls
$docker image ls -a --->모든(중간 이미지까지) 이미지를 표시
$docker image ls --digests ---> 다이제스트를 표시
$docker image ls -q ---> docker image id만 표시
#5. docker image 다운로드
$docker pull [다운받을아이템]
$docker image pull [다운받을아이템]
$docker image pull [다운받을아이템]:[태그명] ---> 지정한 태그의 아이템을 다운로드
$docker image pull -a [다운받을아이템] ---> 해당 아이템의 모든 태그를 다운로드
#6. docker 컨테이너 실행
$docker container --name [컨테이너명] -d -p 80:80 [이미지명]
ex) docker container --name webserver -d -p 80:80 nginx
#7. docker 컨테이너 실행목록 확인
$docker container ps
#8. docker 컨테이너 상세 확인
$docker container stats [컨테이너명]
#9. docker 컨테이너 정지/기동
$docker stop/start [컨테이너명]
#10. docker image 상세정보 확인
$docker image inspect centos:7
#11. docker image tag 설정 하기 (docker hub 에 작성한 이미지를 등록하기 위한 방법)
$docker image tag [아이템명] [docker hub 사용자명]/이미지명:태그명
ex) docker image tag nginx gogildong/webserver:1.0 --> 기존에 존재하는 nginx 이미지를 사용하여 gogildong 사용자의 webserver 란 이미지의 1.0 태그 버젼을 설정하는 경우
#12. docker hub에서 검색하기
$docker search [아이템명]
#13. docker image 삭제
$docker image rm [이미지명]
ex) docker image rm nginx
$docker image rm -f nginx ---> image 강제 삭제
$docker image rm --no-prune nginx ---> image 삭제(중간이미지는 삭제하지 않음)
#14. 사용하지 않는 docker image 삭제
$docker image prune
$docker image prune -a --->사용하지 않는 이미지를 모두 삭제
$docker image prune -f --->사용하지 않는 이미지를 강제로 삭제
#15. docker hub 에 로그인
docker hub 레파지토리에 이미지 업로드를 하려면 hub에 로그인을 해야 한다.
(로그인 상태유저 확인은 $docker info | grep Username 하면 됨 . 아무것도 안나오면 로긴 안된 상태임)
$docker login
Username : 등록한 사용자명
Password : 등록한 패스워드
Login succeeded
#16. docker image 업로드
$docker image push [docker hub 사용자명]/[이미지명]:[태그명]
ex)docker image push reo/nginx
docker image push reo/nginx:1.1
--------------------------------------------------------------------------------------
docker Container
- image 로 부터 컨테이너를 생성한다.
- image의 실체는 docker 에서 서버 기능을 작동시키기 위해 필요한 디렉토리 및 파일들 이다.
- Life Cycle
1) Container 생성
2) Container 생성 및 시작
3) Container 정지
4) Container 삭제
- Life Cycle 상세설명
1) Container 생성
> 명령어 : docker container create
> 명령어 실행하면 이미지에 포함될 linux의 디렉토리와 파일들의 스냅샷(스토리지 안에 존재하는 파일과 디렉토리를 특정 타이밍에 추출한것)을 취한다.
> 해당 명령어는 컨테이너를 작성하기만 할뿐 실행하지 않는다.
2) Container 생성 및 시작
> 명령어 : docker container run
> 이미지로 부터 컨테이너를 생성하고, 컨테이너 상에서 임의의 프로세스를 시작한다.
3) Container 정지
> 명령어 : docker container stop
docker container start (중단된 컨테이너 시작)
docker container restart (재시작)
4) Container 삭제
> 명령어 : docker container rm
--------------------------------------------------------------------------------------
#17. 컨테이너 생성 및 시작
$docker container run [옵션] [이미지명]:[태그명] [인자값]
ex)docker container run -it --name "test" centos /bin/cal
: centos 라는 이미지를 사용하여, test 라는 컨테이너를 실행하고, 컨테이너 안에서 /bin/cal 명령을 실행한다.
근데, 이 결과를 콘솔에 출력(-it) 한다.
#18.컨테이너를 백그라운드로 생성 및 시작
$docker container run -d [이미지명]:[태그명] [인자값]
ex) docker container run -d centos /bin/ping localhost ---> 백그라운드(-d)에서 실행 하는 것을 디태치 모드 라고 한다.
#19. 백그라운드로 실행되고 있는 컨테이너 로그 확인
$docker container logs -t [컨테이너식별자]
ex)docker container logs -t fbcddkdhgmdfk ---> fb~는 컨테이너id 중 일부임
#20. 컨테이너 네트워크 설정
$docker container run [네트워크 옵션] [이미지명]:[태그명] [인자]
$docker container run -d -p 8080:80 nginx --->포트매핑(-p) host포트(8080):컨테이너포트(80)
$docker container run -d --dns 192.168.1.1 nginx --->dns설정(--dns)
$docker container run -it --add-host test.com:192.167.1.1 centos --->/etc/hosts 파일에 값 설정(--add-host)
#21. 컨테이너 자원 설정
$docker container run [자원옵션] [이미지명]:[태그명] [인자]
$docker container run --cpu-shares=512 --memory=1g centos ---> cpu 상대비율지정(--cpu-shares) 및 메모리 할당(--memory)
$docker container run -v /Users/reo/tempdir:/user/share/nginx/tdir nginx ---> 호스트 os와 컨테이너 안의 디렉토리를 공유(-v 또는 --volume)
호스트(/Users/reo/tempdir):컨테이너(/user/share/nginx/tdir)
#22. 컨테이너 환경을 설정
$docker container run -it -e utname=gogo centos /bin/bash ----> 환경변수 설정(-e)
$docker container run -it --env-file=filename centos /bin/bash ---> 특정파일내용을 일괄로 환경변수로 설정(--env-file=파일명)
$docker container run -it -w=/test centos /bin/bash ---> 컨테이너의 작업 디렉토리를 설정 (-w=디렉토리명)
#23. 기동중인 컨테이너 상태 확인
$docker container ls ---> 실행중인 컨테이너 모두 표시
$docker container ls -s ---> file size 표시
$docker container ls -a ---> 정지중인 컨테이너도 모두 표시
$docker container ls -a -f name=test ---> 필터링 하여 표시(-f )
#24. 컨테이너 가동 확인
$docker container stats [컨테이너식별자,즉 id]
#25. 컨테이너에서 실행중인 프로세스 확인
$docker container top [컨테이너식별자,즉 id]
#26. 컨테이너 삭제
$docker container rm [옵션] [컨테이너식별자,즉 id]
$docker container rm -f dkdbdhk23fj --->실행중인 컨테이너를 강제로 삭제
$docker container rm -v dkjfhddk345dk ---> 할당한 볼륨을 삭제
$docker container prune ---> 정지중인 모든 컨테이너를 삭제
#27. 실행중인 컨테이너에서 작동중인 프로세스를 모두 중단
$docker container pause [컨테이너식별자] ---> 중단 시키면 컨테이너의 status 가 paused 로 변경됨
$docker container unpause [컨테이너식별자] ---> 중단 재개함
#28. 가동중인 컨테이너에 연결
$docker container attach [컨테이너명]
$docker container attach test ---> 가동중인 test란 컨테이너에 연결할때
연결을 끊으려면 Ctrl+C
#29. 가동중인 컨테이너에서 새로운 프로세스를 실행
$docker container exec
$docker container exec -it webserver /bin/bash ---> 가동중인 webserver 라는 컨테이너 안에서 /bin/bash 를 실행
exec 명령어는 실행중인 컨테이너에 대해서만 실행 가능한 명령어임!!!
#30. 가동 컨테이너의 포트 확인
$docker container port [컨테이너식별자]
$docker container port reoserver
80/tcp -> 0.0.0.0:80 (컨테이너의 80 포트 -> 호스트 80 포트로 전송)
#31. 컨테이너 이름 변경
$docker container rename [올드명] [신규명]
#32. 컨테이너 안의 파일을 호스트로 복사
$docker container cp [컨테이너식별자]:[컨테이너파일경로] [호스트파일경로]
$docker container cp reoserver:/User/reo/test/test.txt /tmp/test.txt ---> 컨테이너파일을 호스트로 복사
$docker container cp ./test.txt reoserver:/tmp/test.txt ---> 호스트파일을 컨테이너로 복사
#33. 컨테이너 변경사항 확인
: 컨테이너 안에서 변경이 발생하여, 이미지로부터 생성되었을때와 달라진 점을 확인하기 위함
$docker container diff [컨테이너식별자]
[변경구분]
- A: 파일추가
- D: 파일삭제
- C: 파일수정
iyeonghoui-MacBook-Pro:~ ireo$ docker diff reoserver
C /root
A /root/.bash_history
C /etc
A /etc/subgid-
C /etc/subuid
C /etc/group
A /etc/shadow-
A /etc/group-
A /etc/gshadow-
C /etc/subgid
A /etc/subuid-
C /etc/gshadow
A /etc/passwd-
C /etc/passwd
C /etc/shadow
C /var
C /var/log
C /var/log/tallylog
C /var/log/faillog
#34. 컨테이너로부터 이미지 만들기
$docker container commit [옵션] [컨테이너식별자] [이미지명]:[태그명]
$docker container commit reoserver iamreob/testserver1:1.0 --> reoserver 컨테이너를 docker hub iamreob 사용자의 testserver 란 이름의 이미지 1.0 태그로 만듦
#35. 기동중인 컨테이너의 디렉토리와 파일들을 모아서 tar 파일로 만들기
$docker container export reoserver > test.tar
#36. tar 파일로부터 이미지 작성
$docker image import [파일 또는 url] | - [이미지명]
#37. docker 이미지를 tar 파일로 저장
$docker image save [옵션] [저장파일명] [이미지명]
$docker image save -o export.tar tensorflow ---> tensorflow 이미지를 export.tar 파일로 저장
#38. tar 이미지로부터 이미지를 읽어들이기
$docker image load [옵션]
$docker image load -i export.tar ---> export.tar 라는 이름의 이미지를 읽어들임
!!! export/import ...... save/load 차이 !!!
: docker container export 로 만든 tar 파일과
docker image save 로 만든 tar 파일은 바탕이 되는 이미지는 똑같지만, 내부적인 디렉토리와 파일 구조가 다름
(image 를 save 하면 , image의 레이어 구조가 포함된 형태로 tar 파일이 만들어짐)
따라서, docker container export 로 작성한 것을 읽어들일때는 docker image import
docker image save 로 작성한 것을 읽어들일때는 docker image load
#39. 불필요한 이미지/컨테이너/볼륨/네트워크 를 일괄삭제
$docker system prune [옵션]
$docker system prune -a --->사용하지 않는 리소스를 모두 삭제한다
$docker system prune -f --->강제로 삭제한다
#40. DockerFile 명령
- FROM : 베이스 이미지 지정
- RUN : 명령 실행 (Docker Image 를 작성하기 위해 실행하는 명령을 기술할때 사용)
- CMD : 컨테이너 실행 명령( Image 를 바탕으로 생성된 컨테이너 안에서 실행할 명령을 기술할때 사용)
단, dockerfile 에는 1개의 CMD 만 명령을 기술할 수 있습니다. 여러개를 기술할 경우 마지막 명령만 유효합니다.
- LABEL : 라벨 설정
- EXPOSE : 포트 익스포트
- ENV : 환경변수 (Dockerfile 안에서 환경변수를 설정하고 싶을때 사용)
(!!!지정방식 2가지!!!)
1)
- ADD : 파일/디렉토리 추가
- COPY : 파일 복사
- ENTRYPOINT : 컨테이너 실행 명령
( Dockerfile 에서 빌드한 이미지로부터 Docker 컨테이너를 시작할때, 즉 docker container run 명령실행시에 실행되는 명령어를 기술 )
(!!!CMD 와 ENTRYPOINT 의 차이 !!!)
-> ENTRYPOINT 명령으로는 실행하고 싶은 명령어 자체를 지정하고, CMD 로는 해당 명령의 인수를 지정한다.
-> docker container run 명령 실행시에 인수로 어떤 값을 지정한다면 해당 인수가 우선시되고, CMD 명령은 무시되게 된다.
(Docker file 샘플)
FROM ubuntu:latest
ENTRYPOINT ["top"]
CMD ["-d", "10"]
일 경우
$docker container run -it 이미지명 --> 설정대로 10초간격으로 갱신
$docker container run -it 이미지명 -d 2 --> 설정무시하고 2초 간격으로 갱신
- VOLUME : 볼륨 마운트
- USER : 사용자 지정
- WORKDIR : 작업 디렉토리
( Dockerfile 에 씌여있는 (CMD / RUN / ENTRYPOINT / COPY / ADD 등) 명령어를 실행시키기 위한 작업용 디렉토리를 지정함)
-> 지정한 디렉토리가 존재하지 않으면 새로 생성함
-> 여러번 사용할 수 있음
-> WORKDIR 에서는 ENV 에서 지정한 환경변수를 사용할 수 있습니다.
- ARG : Dockerfile 안의 변수
- ONBUILD : 빌드 완료 후 실행되는 명령
( dockerfile 로 이미지를 생성한 후에, 해당 이미지를 다른 dockerfile 에서 베이스 이미지로 지정하여 빌드할때 실행할 명령을 기술)
- STOPSIGNAL : 시스템 콜 시그널 설정 ( 컨테이너를 종료할때 송신하는 시그널을 설정할때 사용)
- HEALTHCHECK : 컨테이너의 헬스체크 (컨테이너 안의 프로세스가 정상적으로 작동하고 있는지를 체크 할때 사용 )
- SHELL : 기본 쉘 설정
#41. Dockerfile 로 부터 docker image 만들기
$docker build -t [생성할이미지명] :[태그명] [dockerfile위치]
$docker build -t reotest:1.0 /Users/reo/Documents/APP/dockerSecondDir
#42. 파일명을 지정한 Dockerfile 로 부터 docker image 만들기
$docker build -t sample -f Dockerfile.base . ---> 현재폴더에 있는(.) Dockerfiel.base 파일로 부터 이미지 만들기
(단, 파일명이 Dockerfile 이외인 경우에는 Docker Hub에서 이미지의 자동생성기능을 사용할 수 없다)고 한다... 잘 이해가 안감
#43. Dockerfile 작성시 RUN 명령어 사용법
1) Shell 형식으로 기술
#Nginx 설치
RUN apt -get install -y nginx
2) Exec 형식으로 기술
- Shell 형식으로 명령을 기술하면, /bin/sh 에서 실행되지만, Exec 형식으로 기술하면 쉘을 경유하지 않고 직접 실행한다.
따라서, 명령인자에 환경변수값을 지정할 수 없다.
실행하고 싶은 명령을 json배열로 지정해야 한다.
#Nginx 설치
RUN ["/bin/bash", "-c", "apt -get install -y nginx"]
#44. Docker image 생성시에 어떤 명령이 실행되는지 확인
$docker history [이미지명]
Docker Compose
: 여러 (의존관계에 있는) 컨테이너를 한번에 만들거나 모아서 관리하기 위한 툴
- compose 정의파일은 web application의 의존관계 (데이터베이스, 큐, 캐쉬, 애플리케이션 등)를 모아서 설정할 수 있음
- 이 정의 파일을 바탕으로 docker-compose 명령을 실행하면 여러개의 컨테이너를 모아서 시작, 중지 할 수 있음
$docker-compose up ---> 컨테이너 시작(이미지 다운로드 및 빌드)
$docker-compose ps ---> 가동중인 컨테이너의 상태 확인
$docker-compose stop ---> 여러 컨테이너 정지
$docker-compose down ---> docker compose에서 이용한 리소스 삭제
Docker Compose 를 위한 yaml 작성방법
- 이미지 빌드
: 이미지의 작성을 Dockerfile에 기술하고, 그것을 자동으로 빌드하여 베이스 이미지로 지정할때 build 를 지정한다.
docker-compose.yaml |
services: webserver: build: . |
Dockerfile |
FROM ubuntu |
위와 같이 파일 구성을 한 후에 아래명령어로 컨테이너 생성 한다.
$docker-compose up --build
- 다른이름의 Dockerfile 과 context 지정
: dockerfile이 있는 디렉토리나 git repository url 을 context 로 지정하고,
다른이름의 Dockerfile 을 dockerfile 에 지정한다.
docker-compose.yaml |
services: webserver: build: context: /test dockerfile: Dockerfile-other |
- 빌드시의 인수지정
: docker image 를 빌드할때 args 로 인수를 지정할 수 있다.
docker-compose.yaml |
services: webserver: build: args: projectno: 1 user: reo |
- 컨테이너간 연결( links )
: 다른 컨테이너에 대한 링크기능을 사용하여 연결하고 싶을때는 links를 사용하여 연결할 컨테이너명을 설정한다.
logserver 라는 이름의 컨테이너와 링크시키고 싶을때 아래와 같이 지정하고 alias 를 지정하고 싶을때는 (서비스명:alias명) 으로 지정한다.
docker-compose.yaml |
links: - logserver - logserver:log01 |
- 컨테이너간 통신(ports/ expose)
: 컨테이너가 공개하는 포트는 ports 로 지정한다.
(host 포트:컨테이너 포트) 또는 (컨테이너 포트) 만 지정
(컨테이너 포트) 만 지정한 경우 host 포트는 랜덤지정임
!!!주의사항!!!
yaml 파일은 xx:yy 형식을 시간으로 해석하므로 port번호 설정시에는 반드시 겹따옴표(" ")로 문자열 정의해야 함
docker-compose.yaml |
ports: - "3000" - "8000:8000" |
: host 에 대한 port 는 공개하지 않고, 링크기능을 사용하여 연결하는 컨테이너에게만 port를 공개할때 expose 를 사용한다.
즉, 컨테이너 내부에만 공개하는 port 지정시 사용
- 서비스의 의존관계 정의 ( depends_on )
: 여러 서비스의 의존관계 정의
webserver 컨테이너를 시작하기 전에 db 컨테이너와 redis 컨테이너를 시작하고 싶을때 아래와 같이 정의한다.
docker-compose.yaml |
services: webserver: build: . depends_on: - db - redis redis : image: redis db : image: postgress |
!!!주의사항!!!
depends_on 은 컨테이너의 시작순서만 제어할 뿐, 컨테이너상의 애플리케이션이 이용가능해질때까지 기다리고 제어를 하지는 않는다.
따라서, 의존관계에 있는 애플리케이션에서 이에 대한 대비가 필요하다.
- 컨테이너 데이터 관리 ( volumes / volumes_from )
: 컨테이너에 볼륨을 마운트할 때는 volumes 를 지정합니다.
host 측에서 마운트할 경로를 지정하려면 (host 디렉토리경로 : 컨테이너 디렉토리경로) 를 지정한다.
docker-compose.yaml |
volumes : - /var/lib/mysql - app/ : /tmp/test/app - test/ : /tmp/test/ : ro ---> 읽기전용지정 |
#45. Docker compose 버젼 확인
$docker-compose --version
#45. Docker compose 의 주요 sub 명령어
sub 명령어 |
설명 |
up |
컨테이너 생성/시작 |
ps |
컨테이너 목록 표시 |
logs |
컨테이너 로그 출력 |
run |
컨테이너 실행 |
start |
컨테이너 시작 |
stop |
컨테이너 정지 |
restart |
컨테이너 재시작 |
pause |
컨테이너 일시정지 |
unpause |
컨테이너 재가동 |
port |
공개 포트 번호 표시 |
config |
구성확인 |
kill |
실행중인 컨테이너 강제 중지 |
rm |
컨테이너 삭제 |
down |
리소스 삭제 |
'DevOps' 카테고리의 다른 글
docker - swarm/compose/service/stack (0) | 2019.06.07 |
---|---|
Docker Error (0) | 2019.06.05 |
쿠버네티스 기존 리소스 수정 (0) | 2019.02.08 |
쿠버네티스 명령어 #6 (0) | 2019.01.31 |
쿠버네티스 구조 (0) | 2019.01.10 |