일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- springboot
- mongodb operator
- devops #jenkins
- Strimzi
- k8s
- java
- Engineer
- container
- 쿠버네티스
- 도커
- Kubernetes
- ioredirection
- linux
- docker
- httpd실행
- bash
- RSS
- namespace
- variable
- Vagrant
- multivm
- 컨테이너
- WEB
- 파이썬
- devops #engineer
- DOIK
- aws #engineer
- 초간단파이썬
- python
- nginx
- Today
- Total
샤인의 IT (막 적는) 메모장
[Docker] 도커 이미지 이해와 기본 명령어 본문
도커는 컨테이너를 올리거나 분리하는 등의 작업이 굉장히 쉬운 편입니다.
먼저 도커를 이해하는데 필요한 이미지와 컨테이너에 대해 알아봅시다.
이미지
도커 이미지는 도커에서 읽기 전용 템플릿으로 컨테이너와 관련된 인스턴스를 저장한 파일입니다.
하나의 컨테이너가 올라가기 위해 단일 이미지 혹은 여러 이미지로 구성되어 있습니다.
이를 Overlay라고 하는데 말 그대로 겹겹이 쌓아 올린다라는 느낌으로 이해하시면 좀 더 편합니다
도커 이미지 확인
#My Docker Image list
docker images
#Image pull
docker pull <IMAGE>:<TAG>
#Check my image layer
docker inspect <MY-IMAGE>
#Check Image history
docker history <MY-IMAGE>
이미지 확인 후 Inspect 명령어를 사용하여 Overlay된 이미지 목록을 확인할 수 있습니다
JSON으로 구성되어 있으며 RootFS에 Layers를 보게 되면 Overlay되어 있고 PID로 구성된 디렉토리를 확인하실 수 있습니다. 현재 예제의 Nginx의 3개의 이미지 레이어를 통해 구성된 것이죠
[root@docker ~]# docker inspect nginx:1.14
[
{
"Id": "sha256:295c7be079025306c4f1d65997fcf7adb411c88f139ad1d34b537164aa060369",
"RepoTags": [
"nginx:1.14"
],
"RepoDigests": [
"nginx@sha256:f7988fb6c02e0ce69257d9bd9cf37ae20a60f1df7563c3a2a6abe24160306b8d"
],
"Parent": "",
"Comment": "",
"Created": "2019-03-26T23:14:52.227945051Z",
"Container": "5e8d96e0fb01832974f0680a9aff2fbadc37fcf30447ae30e19f59b926672041",
"ContainerConfig": {
"Hostname": "5e8d96e0fb01",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.14.2-1~stretch",
"NJS_VERSION=1.14.2.0.2.6-1~stretch"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"ArgsEscaped": true,
"Image": "sha256:ac539667b75fa925232b8dbbfdfb8adb98007c44e11a5fbd4001916c0fcc0bd4",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"DockerVersion": "18.06.1-ce",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.14.2-1~stretch",
"NJS_VERSION=1.14.2.0.2.6-1~stretch"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"ArgsEscaped": true,
"Image": "sha256:ac539667b75fa925232b8dbbfdfb8adb98007c44e11a5fbd4001916c0fcc0bd4",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGTERM"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 109129446,
"VirtualSize": 109129446,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/3371b2db5b86be01d04000df75fc242b7e0a0c5105d7755308ef076cf8e935e9/diff:/var/lib/docker/overlay2/0f9fc2e85a663b852e99e4fce7149ac6a18641c23d5e221526cf5f14370c0e99/diff",
"MergedDir": "/var/lib/docker/overlay2/48d1006a4b30a2bcbce9733d20a725b0147aae3be47f3f117585ea120413d28c/merged",
"UpperDir": "/var/lib/docker/overlay2/48d1006a4b30a2bcbce9733d20a725b0147aae3be47f3f117585ea120413d28c/diff",
"WorkDir": "/var/lib/docker/overlay2/48d1006a4b30a2bcbce9733d20a725b0147aae3be47f3f117585ea120413d28c/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:5dacd731af1b0386ead06c8b1feff9f65d9e0bdfec032d2cd0bc03690698feda",
"sha256:b8f18c3b860b067be09836beadd676a0aa1e784ec28cf730986859b4146c344a",
"sha256:82ae01d5004e2143b642b1a008624e7521c73ab18e5776a22f18a172b9dbec80"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
또한 History라는 명령어를 통하여 해당 이미지를 어떻게 빌드했는지 알 수 있습니다.
그러나 정확하게 이미지를 만들기 위하여 어떻게 작업했는지는 알 수 없습니다. (도커 보안성의 문제)
보통 이미지를 받아서 사용하는 경우가 많은데 검증된 이미지가 아닌
일반 유저가 커스터마이징한 이미지는 문제가 될 수 있으니 주의하면서 사용해주세요
[root@docker ~]# docker history nginx:1.14
IMAGE CREATED CREATED BY SIZE COMMENT
295c7be07902 24 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 24 months ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B
<missing> 24 months ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 24 months ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B
<missing> 24 months ago /bin/sh -c set -x && apt-get update && apt… 53.8MB
<missing> 24 months ago /bin/sh -c #(nop) ENV NJS_VERSION=1.14.2.0.… 0B
<missing> 24 months ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.14.2-… 0B
<missing> 24 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 24 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 24 months ago /bin/sh -c #(nop) ADD file:4fc310c0cb879c876… 55.3MB
history 명령어를 통하여 해당 이미지가 2년전에 작업된 것을 확인할 수 있고 지정한 환경변수 및 명령어를 확인할 수 있습니다.
컨테이너 실행 및 종료
그러면 Pull한 이미지를 컨테이너로 올려보는 작업을 수행해보도록 하겠습니다.
저는 예제로 Nginx:1.14 이미지를 이용하겠습니다.
이미지를 컨테이너로 올리는 작업에서 Foreground와 Background로 올릴 수 있는데
기본적으로 Foreground로 올라가지만 컨테이너를 Background로 올리고 싶은 경우 -d (detach) 옵션을 사용합니다.
#Upload Container
#Foreground
docker run -it --name my-fore-web nginx:1.14 <Command>
#Background
docker run -a --name my-back-web nginx:1.14
#Docker Process list
docker ps
#Docker All Process list
docker ps -a
[root@docker ~]# docker run -it --name my-fore-web nginx:1.14 /bin/bash
root@a09390ae1ce3:/#
root@a09390ae1ce3:/# exit
[root@docker ~]# docker run -d --name my-back-web nginx:1.14
0e389b3911d5d91f468352cd65c82a00e2c9c87020b27184563b173fa0f346ca
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e389b3911d5 nginx:1.14 "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp my-back-web
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e389b3911d5 nginx:1.14 "nginx -g 'daemon of…" About a minute ago Up About a minute 80/tcp my-back-web
a09390ae1ce3 nginx:1.14 "/bin/bash" 2 minutes ago Exited (127) 2 minutes ago my-fore-web
가동된 컨테이너를 가지고 놀아봅시다.
현재 Exit된 my-fore-web 컨테이너를 시작하고 중지하고 삭제해보도록 하겠습니다.
#Start Container
docker start my-fore-web
#Container Log check
docker logs my-fore-web
#Access Container
docker exec -it my-fore-web /bin/bash
#Stop Container
docker stop my-fore-web
#Delete Container
docker rm my-fore-web
[root@docker ~]# docker start my-fore-web
my-fore-web
[root@docker ~]# docker logs my-fore-web
root@a09390ae1ce3:/# ll
bash: ll: command not found
root@a09390ae1ce3:/# docker run -a --name my-fore-web nginx:1.14
bash: docker: command not found
[root@docker ~]# docker exec -it my-fore-web /bin/bash
root@a09390ae1ce3:/# exit
[root@docker ~]# docker stop my-fore-web
my-fore-web
[root@docker ~]# docker rm my-fore-web
my-fore-web
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0e389b3911d5 nginx:1.14 "nginx -g 'daemon of…" 18 minutes ago Up 18 minutes 80/tcp my-back-web
컨테이너 관리
가동된 컨테이너를 따로 관리할 수 있는데 컨테이너 이름을 변경하거나 컨테이너 내 파일 복사, 변경이력 확인 등을 명령어를 통해 수행할 수 있습니다.
#Container rename
docker container rename my-fore-web my-fore1-web
#Container 내 File Copy
docker container cp my-fore-web:/home /my-directory
#Container 변경이력
docker container diff my-fore-web
[root@docker ~]# docker start my-fore-web
my-fore-web
[root@docker ~]# docker container rename my-fore-web my-fore1-web
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b6ee957dcc4 nginx:1.14 "/bin/bash" About a minute ago Up 59 seconds 80/tcp my-fore1-web
[root@docker ~]# docker container cp my-fore1-web:/home .
[root@docker ~]# docker diff my-fore1-web
C /root
A /root/.bash_history
도커에서 이미지를 받아 컨테이너로 올리는 방법에 대해서 알아봤습니다.
이미지와 컨테이너에 대한 이해가 확실히 잡히시면 될 것 같습니다.
Good Day!
'Container > Docker' 카테고리의 다른 글
[Docker] Dockerfile 작성 (0) | 2021.03.26 |
---|---|
[Docker] Docker Registry (0) | 2021.03.25 |
[Docker] 이미지 태깅 및 압축 파일 만들기 (0) | 2021.03.24 |
[Docker] 도커 설치 (0) | 2021.03.23 |
[Docker] What is Docker? (0) | 2021.03.23 |