일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Zeppelin
- 로그인
- config
- 설정
- Mac
- Docker
- login
- spring
- 클러스터
- 레디스
- hive
- 자동
- 간단
- Jenkins
- gradle
- 젠킨스
- EMR
- vue
- Cluster
- 머신러닝
- java
- Kafka
- aws
- SpringBoot
- fastcampus
- ec2
- 자바
- 예제
- redash
- Redis
- Today
- Total
코알못
[Docker] 구성 및 기본 명령어 본문
도커의 기본 단위인 '이미지', '컨테이너' 에 대해 알아 봅시다.
이미지와 컨테이너는 1:N 관계로 아래와 같이 정의 됩니다.
- 이미지 : 컨테이너를 생성할때 필요한 요소로 컨테이너의 목적에 맞는 바이너리와 의존성이 설치 되어 있음, 여러개의 계층으로 된 바이너리 파일로 존재
- 컨테이너 : 호스트와 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스로 이미지는 읽기 전용으로 사용하여 변경 사항은 컨테이너 계층에 저장
- -> 컨테이너에서 무엇을 하든 이미지는 영향 받지 않음
도커 파일을 bulid 하면 도커 이미지가 되며, 도커 이미지를 run 하면 도커 컨테이너가 됩니다.
도커 이미지 이름의 경우 아래와 같이 지정할 수 있으며
[저장소이름]/[이미지이름]/[이미지태그]
저장소 이름 생략시 기본 저장소 '도커 허브'로 인식
이미지 태그 생략시 최신 리비전을 가리키는 'lastest'로 인식 됩니다.
이미지 저장소의 경우 public, private 저장소가 있으며
public 의 경우 공개형으로 누구나 이미지를 가져다가 쓸 수 있으며 예로 quay, docker hub 가 있다.
private 의 경우 비공개형으로 보통 기업내에서 만들어 사용시에 이용하며 예로 aws ecr, docker registry 가 있다.
도커의 라이프 사이클의 경우 매우 복잡하나 간단하게 표현하면 아래와 같다.
이제 도커에서 사용하는 명령어를 보자!
아래와 같이 컨테이너를 시작 할 수 있으며 만약 로컬에 이미지가 없다면 도커 엔진이 도커 저장소로 부터 이미지를 pull 한다.
// 컨테이너 생성 및 시작
$ docker run [image]
// 컨테이너 생성
$ docker create [image]
// 컨테이너 시작
$ docker start [container]
// 도커 실행중인 컨테이너 목록
$ docker ps
// 도커 전체 컨테이너 목록
$ docker ps -a
실습을 통해 명령어를 익혀보자!
// run 을 통한 nginx 이미지 생성 및 실행 , 종료
$ docker run nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
ae13dd578326: Pull complete
6c0ee9353e13: Pull complete
dca7733b187e: Pull complete
352e5a6cac26: Pull complete
9eaf108767c7: Pull complete
2022/03/25 08:10:56 [notice] 1#1: start worker process 32
2022/03/25 08:10:56 [notice] 1#1: start worker process 33
2022/03/25 08:10:56 [notice] 1#1: start worker process 34
2022/03/25 08:10:56 [notice] 1#1: start worker process 35
2022/03/25 08:10:56 [notice] 1#1: start worker process 36
exit
프로세스 확인
// 실행중이 아니므로 안나옴
$ docker ps
// 실행중으로 종료 되었다고 나옴
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
163bad5d12a5 nginx "/docker-entrypoint.…" About a minute ago Exited (0) 32 seconds ago serene_benz
// create start를 통한 nginx 이미지 생성 및 실행 , 종료
// 도커 컨테이너 아이디 리턴
$ docker create nginx
abcdsdsadasdasdasdasdsdsadasd
// 도커 ID, Name 확인 (12 자리로 ID 표기되며, 이름도 자동으로 생성)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdsdsadasd nginx "/docker-entrypoint.…" 9 seconds ago Created happy_germain
163bad5d12a5 nginx "/docker-entrypoint.…" 3 minutes ago Exited (0) 2 minutes ago serene_benz
// 도커 name 으로 기동
$ docker start happy_germain
// 프로세스 확인
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
abcdsdsadasd nginx "/docker-entrypoint.…" 38 seconds ago Up 4 seconds 80/tcp
컨테이너를 run으로 시작시 여러 옵션을 줄 수 있으며 아래와 같다.
$ docker run \ -- docker 시작
-i -t \ -- 표준 입력/출력 사용, 가상 터미널 할당
--rm \ -- 컨테이너 실행 종료후 자동 삭제
-d \ -- 백그라운드 모드로 시작
--name docker-corin \ -- 컨테이너 이름 지정
-p 80:80 \ -- 컨테이너간 포트 바인딩
-v /test/docker:/docker \ -- 컨테이너간 볼륨 바인딩
nginx:last \ -- 실행할 이미지
ls -- 컨테이너 내 실행 명령어
실습을 통해 손에 익혀보자!
ubuntu 이미지를 가져와서 설치하며 정상적으로 pull 이 되었다.
$ docker run ubuntu:focal
Unable to find image 'ubuntu:focal' locally
focal: Pulling from library/ubuntu
4d32b49e2995: Pull complete
Digest: sha256:bea6d19168bbfd6af8d77c2cc3c572114eb5d113e6f422573c93cb605a0e2ffb
Status: Downloaded newer image for ubuntu:focal
확인 해보면 실행중인 컨테이너 항목에는 없으며
전체 컨테이너 목록을 보면 30초 전에 생성 되었고 기본 명령어 bash를 사용 하였으며 28초 전에 종료 되었다고 한다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
be2e4f954e02 ubuntu:focal "bash" 30 seconds ago Exited (0) 28 seconds ago relaxed_easley
// 없음
$ docker ps
이유는 bash 명령어의 경우 표준 입력 필요로 하나 할 수 없었기에 종료 된 것이다.
이럴때 -i -t 이며 옵션을 주어 run 하면 표준 입력을 받을 수 있으며 해결 가능하다.
$ docker run -i -t ubuntu:focal
root@67f0a8685f1e:/#
여러가지 명령어를 입력해본다.
root@67f0a8685f1e:/# ls -l
total 48
lrwxrwxrwx 1 root root 7 Mar 16 17:07 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Apr 15 2020 boot
drwxr-xr-x 5 root root 360 Mar 25 08:30 dev
drwxr-xr-x 1 root root 4096 Mar 25 08:30 etc
drwxr-xr-x 2 root root 4096 Apr 15 2020 home
lrwxrwxrwx 1 root root 7 Mar 16 17:07 lib -> usr/lib
lrwxrwxrwx 1 root root 9 Mar 16 17:07 lib32 -> usr/lib32
lrwxrwxrwx 1 root root 9 Mar 16 17:07 lib64 -> usr/lib64
lrwxrwxrwx 1 root root 10 Mar 16 17:07 libx32 -> usr/libx32
drwxr-xr-x 2 root root 4096 Mar 16 17:07 media
drwxr-xr-x 2 root root 4096 Mar 16 17:07 mnt
drwxr-xr-x 2 root root 4096 Mar 16 17:07 opt
dr-xr-xr-x 245 root root 0 Mar 25 08:30 proc
drwx------ 2 root root 4096 Mar 16 17:09 root
drwxr-xr-x 5 root root 4096 Mar 16 17:10 run
lrwxrwxrwx 1 root root 8 Mar 16 17:07 sbin -> usr/sbin
drwxr-xr-x 2 root root 4096 Mar 16 17:07 srv
dr-xr-xr-x 13 root root 0 Mar 25 08:30 sys
drwxrwxrwt 2 root root 4096 Mar 16 17:10 tmp
drwxr-xr-x 13 root root 4096 Mar 16 17:07 usr
drwxr-xr-x 11 root root 4096 Mar 16 17:09 var
root@67f0a8685f1e:/#
root@67f0a8685f1e:/# uname -a
Linux 67f0a8685f1e 5.10.104-linuxkit #1 SMP Wed Mar 9 19:05:23 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
root@67f0a8685f1e:/#
root@67f0a8685f1e:/#cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.4 LTS"
만약 종료 없이 나오고 싶다면 'ctrl+p+q' 를 입력하여 나오면 되고, 종료 하길 원한다면 'ctrl+c' 를 눌러서 나온다.
// ctrl+c 눌렀을시 컨테이너가 죽어 있다.
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67f0a8685f1e ubuntu:focal "bash" 6 minutes ago Exited (0) 6 seconds ago musing_haibt
// ctrl+p+q 눌렀을시 컨테이너가 살아 있다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f47e5be74df0 ubuntu:focal "bash" 35 seconds ago Up 34 seconds admiring_einstein
이제 nginx 를 백그라운드로 실행 시켜 보자!
정상적으로 백그라운드로 뜬것을 확인 할 수 있으며
$ docker run -d nginx
d47a77779363b84cd185f79f79299620fec7075c2d0d12c4dd9eda6d057f121a
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d47a77779363 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp objective_cartwright
이번에는 name 을 지정하여 띄워 보자!
정상적으로 'corin-nginx' 이름으로 뜬것을 확인 할 수 있다.
$ docker run -d --name corin-nginx nginx
9e54d599cc92a1cb6432a94c390b050188937c373f7db3685017aebd3a0b459b
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e54d599cc92 nginx "/docker-entrypoint.…" 5 seconds ago Up 5 seconds 80/tcp corin-nginx
그 다음 포트 바인딩을 이용하여 로컬의 80 포트를 컨테이너 80 포트(nginx 기본 포트)와 연결하여 nginx 를 띄워 본다.
docker run -p 80:80 -d nginx
10467971fb3e8a6125e1e4b43244f872d1f1c01a7f7f59d472449fab0d79a296
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10467971fb3e nginx "/docker-entrypoint.…" 3 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp magical_volhard
정상적으로 바인딩 되었는지 호출해보면 정상적으로 nginx 와 연결됨을 확인 할 수 있다.
$ curl localhost:80
\<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
이제 기본 명령어를 변경하여 컨테이너를 실행해보자!
id 라는 명령어가 실행 될 수 있도록 아래와 같이 입력하면
컨테이너가 실행 되고 id 명령어를 호출한 결과를 리턴한뒤 종료 한다.
$ docker run ubuntu:focal id
uid=0(root) gid=0(root) groups=0(root)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55985036d4ec ubuntu:focal "id" 11 seconds ago Exited (0) 9 seconds ago jolly_ishizaka
이제 컨테이너 상세정보를 확인한다. 이 명령어를 통해 컨테이너 이슈시 상세 정보를 확인 한다.
// 컨테이너 상세정보 확인
$ docker inspect [name or container id]
[
{
"Id": "10467971fb3e8a6125e1e4b43244f872d1f1c01a7f7f59d472449fab0d79a296",
"Created": "2022-03-25T08:53:33.2276823Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,...
]
아래와 같이 일시 중지로 컨테이너를 일시적으로 중단 및 재개 할 수 있다.
// 컨테이너 일시 중지
$ docker pause 10467971fb3e
10467971fb3e
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10467971fb3e nginx "/docker-entrypoint.…" 14 minutes ago Up 14 minutes (Paused) 0.0.0.0:80->80/tcp magical_volhard
// 컨테이너 재개
$ docker unpause 10467971fb3e
10467971fb3e
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
10467971fb3e nginx "/docker-entrypoint.…" 14 minutes ago Up 14 minutes 0.0.0.0:80->80/tcp magical_volhard
컨테이너 종료 관련 명령어는 아래와 같다.
// 컨테이너 정상적 종료 (SIGTERM 시그널 전달)
$ docker stop [container]
// 컨테이너 강제 종료 (SIGKILL 시그널 전달)
$ docker kill [container]
// 모든 컨테이너 종료
$ docker stop $(docker ps -a -q)
모튼 컨테이너 종료 실습을 진행해본다.
아래 명령어 입력시 모든 컨테이너의 아이디를 가져오며
$ docker ps -a -q
55985036d4ec
10467971fb3e
9e54d599cc92
d47a77779363
f47e5be74df0
67f0a8685f1e
be2e4f954e02
cf13e44f664c
163bad5d12a5
3fb9db0a8d30
전체 종료후 실행 중인 프로세스 항목이 없는것을 확인 할 수 있다.
$ docker stop $(docker ps -a -q)
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
그 다음 아래와 같이 컨테이너를 삭제 할 수 있으며 실행 중인 컨테이너는 삭제할 수 없어 -f 옵션을 이용하여 강제적으로 종료후 삭제 한다.
여기서 팁은 container id 를 전체적으로 입력 하지 않고 일부만 입력 하여도 도커가 알아서 구분하여 삭제한다.
$ docker run -d nginx
91b40b82ad667fa64129d7a5ccb23a58d697e26c4ee845c9f63f3797c9aaf989
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
91b40b82ad66 nginx "/docker-entrypoint.…" 16 seconds ago Up 15 seconds 80/tcp silly_hofstadter
$ docker rm 91b40b82ad66
Error response from daemon: You cannot remove a running container 91b40b82ad667fa64129d7a5ccb23a58d697e26c4ee845c9f63f3797c9aaf989. Stop the container before attempting removal or force remove
$ docker rm -f 91b40b8
91b40b8
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
마지막으로 생성된 도커 컨테이너 모두를 삭제하는 명령어를 실습해본다.
아래와 같이 전체 컨테이너 목록 확인시 리스트가 없음을 확인 할 수 있다.
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
55985036d4ec1a1a85f2c006f9a00dfc6f9e4930dbdde09e4d322684ffec92a8
10467971fb3e8a6125e1e4b43244f872d1f1c01a7f7f59d472449fab0d79a296
9e54d599cc92a1cb6432a94c390b050188937c373f7db3685017aebd3a0b459b
d47a77779363b84cd185f79f79299620fec7075c2d0d12c4dd9eda6d057f121a
f47e5be74df0bd022fd2ed1907c66e64977fdd69df835c45c3a31d08733a845a
67f0a8685f1ea3f2ca9a7c28bb1f23f01a2b2bb7b8774d9a74f74f29bada268f
be2e4f954e028191bd6cc2b6ed140f3c36ff90b61b216755868eaed3e0aec53d
cf13e44f664cdeafd25d18f15d85dcd96cf1d259e4c44609962bbecedc4981bf
163bad5d12a5eb5cd3f911df822514bde054a5ec1cdcb8771b93221e4eb67964
3fb9db0a8d30a200165e46e9c5fe0eff0122030aedd815ac332e06706cc46354
Total reclaimed space: 3.105MB
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
'ETC' 카테고리의 다른 글
[Docker] 네트워크 (0) | 2022.03.26 |
---|---|
[Docker] 설정 방법 및 실행중인 컨테이너 접속 (0) | 2022.03.25 |
[Docker] 설치 (0) | 2022.03.25 |
[Kubernetes & Docker] 무엇인가? (0) | 2022.03.25 |
5분 안에 구축하는 APIDoc (API 규격서) (0) | 2022.02.27 |