파란하늘의 지식창고
반응형

Docker는 개인 공부하면서 쓰는 정도라 전문적인 사용법을 알고 있지는 않다.

자주 쓰는 명령어를 기록해 둔다.

docker 19.03.5 기준 작성


기본적인 Docker 명령어 사용

# docker [COMMAND]
docker

docker 명령어는 모두 docker [COMMAND]의 형태이다.

'docker' 명령어만 실행하면 사용할 수 있는 명령어가 모두 나열된다.

docker를 사용하면 docker hub에서 docker image를 가져와서 container를 만든다.

수많은 명령어가 있는데 자주 쓰는 명령어는 다음과 같다.

모든 명령어의 자세한 내용을 확인하고 싶은 경우 docker COMMAND --help를 추가하면 된다.

예를 들어 run 명령어의 자세한 내용은 다음과 같이 확인할 수 있다.

docker run --help

container 생성 및 실행 관련 명령어

  • container 생성 및 실행 : run
  • container 중지 : stop
  • container 실행 : start
  • conatiner 재실행 : restart

container 관리 관련 명령어

  • container 확인 : ps
  • container 삭제 : rm

container 실행 관리 관련 명령어

  • container log 확인 : logs
  • container에 명령어 수행 : exec

image 관리 관련 명령어

  • image 확인 : images
  • image 삭제 : rmi
  • image 다운로드하기 : pull
  • image 업로드하기 : push
  • image 태그 지정하기 : tag

위 명령어들을 사용하면 docker image를 가져와서 container를 생성하고 실행, 중지, 삭제를 하는 기본적인 사용을 할 수 있게 된다.

container 생성 및 실행 관련 명령어

run

docker image를 가져와서 docker container를 생성하기 위한 명령어

# docker run [도커 이미지]
docker run mariadb

하지만 보통 저렇게만 쓰지 않는다.

다양한 option과 arguments를 추가해서 사용해야 원하는 대로 사용할 수 있다.

 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

사용할 수 있는 옵션은 아래 명령어를 통해 확인할 수 있다.

docker run --help

run --name [string] 옵션

먼저 가장 많이 사용하는 옵션은 --name이다.

name 없이 생성한 container는 임의의 name이 지정되어 중지하거나 시작할 때 대상의 name을 매번 체크해야 해서 번거롭다.

그래서 생성 시 name을 지정하는 게 좋다.

아래는 image 이름과 동일하게 container name을 지정한 경우이다.

# docker run --name [string] [IMAGE]
docker run --name mariadb mariadb

이렇게 이름을 지정하면 해당 이름으로 container를 시작/중지할 수 있다.

run -d (--detach) 옵션

-d 옵션 없이 run을 실행하면 백그라운드 실행이 아니기 때문에 터미널 종료 시 container도 같이 종료된다.

따라서 -d 옵션도 필수이다.

# docker run -d [IMAGE]
docker run -d mariadb

run -p (--publish) 옵션

container는 외부와 단절되어 있다.

특정 port에 대해 허용을 해야 해당 port를 통해 접근이 가능하다.

오픈 소스 서버들은 기본으로 사용하는 포트들이 있다.

따라서 -p 옵션도 필수이다.

#docker run -p [외부포트:내부포트] [image]
dockekr run -p 3306:3306 mariadb

mariadb, mysql은 3306, jenkins, zeppelin은 8080, PostSQL은 5432, MongoDB는 27017, Nexus는 8081과 같은 기본 포트 설정이 되어 있다.

각 컨테이너 내부 포트는 기본 포트를 사용하더라도 외부 포트는 충돌이 나지 않도록 관리해주어야 한다.

만약 여러 개의 포트를 허용하려면 -p 옵션을 여러 번 사용하면 된다.

docker -p 1234:1234 -p 5678:5678 mariadb

run -v (--volume) 옵션

예를 들어 jenkins container를 만들었다면 이후 jenkins버전이 변경되더라도 설정한 내용은 유지하고 container를 새로운 버전으로 pull 받아 만들기를 원하게 된다.

이런 경우처럼 사용자의 데이터는 유지하면서 컨테이너는 다른 버전을 사용하고자 하는 경우 -v 옵션으로 컨테이너 내 특정 위치를 외부로 연결해 두어 새로 컨테이너를 만들더라도 해당 위치의 데이터는 유지할 수 있다.

#docker run -v [외부위치]:[내부위치] [IMAGE]
docker run -v /data/jenkins:/var/jenkins_home jenkins/jenkins:lts

-p 옵션과 마찬가지로 여러 번 사용하여 마운트 할 수 있다.

run -e (--env) 옵션

사용하려는 이미지가 외부 변수를 전달받아 container 내부에서 사용할 수 있도록 작성되어 있는 경우 지정된 외부 변수를 전달하는 -e 옵션을 사용하면 된다.

-p나 -v와 마찬가지로 여러 번 사용할 수 있다.

#docker run -e [키=값] [IMAGE]
docker run -e POSTGRES_PASSWORD=bluesky -e POSTGRES_USER=bluesky postgres

run --network 옵션

여러 개의 container를 사용하면 container를 삭제/재생성하더라도 container 간 접근을 유지하기 위해 network 옵션을 사용해야 한다.

network를 만들고 run 명령 시 사용할 network를 지정하면 된다.

network에 대해서는 이전에 한번 소개한 글이 있으니 해당 글을 참고하면 된다.

2019/07/26 - [Study/CI&CD] - Docker network 사용하기

 

Docker network 사용하기

개인 공부하는 관점에서 사용하는 것을 정리한 내용이기 때문에 실무랑 상관없는 내용입니다. Docker network 소개 Docker를 설치하면 host의 network interface에 docker0이 추가된다. (리눅스는 ifconfig로 확인..

luvstudy.tistory.com

run 사용 예제

위에서 옵션을 하나하나 설명하였는데 이제 사용하는 경우를 몇 가지 나열해 본다.

# network 생성
docker network create bluesky-network

# nexus 생성
docker run -d -p 8081:8081 --name nexus --network bluesky-network sonatype/nexus3

# jenkins 생성
docker run -d --name jenkins -p 8080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v c:/data/jenkins:/var/jenkins_home -v c:/data/jenkins_m2:/root/.m2 --network bluesky-network -u root jenkins/jenkins:lts

# mongodb 생성
docker run -d --name mongo -p 27017:27017 -v /data/mongo:/data/db  --network bluesky-network mongo

# mariadb 생성
docker run -d --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --network bluesky-network mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 

stop

run 명령어는 image pull + container create + container start를 동시에 처리해 준다.

이렇게 실행된 container를 중지하는 명령어는 stop이다.

#docker stop [CONTAINER]
docker stop mariadb

여러 개를 중지하고 싶은 경우 container를 여러 개 열거한다.

docker stop mariadb rabbitmq jenkins

start

중지된 container를 시작한다.

#docker start [CONTAINER]
docker start mariadb

여러 개를 시작하고 싶은 경우 container를 여러 개 열거한다.

docker start mariadb rabbitmq jenkins

container 실행 관리 관련 명령어

logs

container 내 지정된 로그를 확인할 수 있는 명령어

# docker logs [OPTIONS] [CONTAINER]
docker logs mariadb

마지막 몇 줄의 로그만 확인하고 싶은 경우 -f 옵션을 사용한다.

docker logs -f --tail=100 mariadb

exec

exec는 container에 명령을 수행하는 명령어이다.

주로 사용하는 건 logs로 확인하지 못하는 다른 내용들을 확인하고자 할 경우 container에 직접 들어가기 위해 사용한다.

#docker exec [OPTIONS] [CONTAINER] [ARG...]
docker exec -it mariadb bash

어떤 이미지는 bash alias가 설정되지 않은 경우가 있다.

이 경우는 /bin/sh로 호출한다.

docker exec -it mariadb /bin/sh

container 관리 관련 명령어

ps

현재 실행 중인 container를 확인할 수 있다.

# 현재 실행중인 container 확인
docker ps

# 모든 container 확인
docker ps -a

rm

container를 삭제한다.

실행 중인 container는 삭제할 수 없기 때문에 stop 한 후 삭제하여야 한다.

#docker rm [CONTAINER]
docker rm mariadb

만약 실행 중인 container가 있다면 중지하고 삭제하는 것을 동시에 하고 싶다면 -f 옵션을 사용하면 된다.

docker rm -f mariadb

여러 개를 삭제하고 싶은 경우 container를 여러 개 열거한다.

docker rm mariadb rabbitmq jenkins

여기까지 나열된 명령어를 사용하면 원하는 오픈소스의 image를 docker hub 저장소에서 다운로드하여 container를 만들고 실행하고 중지하고 지우고 원하는 옵션을 추가해 다시 재 실행하는 사이클을 반복할 수 있다.

https://hub.docker.com/

 

Docker Hub

Docker Certified:Trusted & Supported Products Certified Containers provide ISV apps available as containers. Certified Plugins for networking and volumes in containers. Certified Infrastructure delivers an optimized and validated Docker platform for enterp

hub.docker.com

대부분의 오픈 소스들은 docker hub 페이지에 어떻게 사용하면 되는지에 대한 사용법을 가이드해주고 있기 때문에 사용하는데 그리 어려움은 없는 편이다.

dockekr hub는 누구나 이미지를 올릴 수 있는 저장소이기 때문에 해당 오픈소스에서 제공하는 official image인지 표시해주고 있다.


image 관리 관련 명령어

images

run 명령어를 사용하면 image를 다운로드하여 container를 생성한다.

다운로드한 이미지를 확인하고 싶은 경우 images 명령어를 사용한다.

docker images

rmi

image를 삭제한다.

해당 image를 사용하는 container가 있다면 삭제할 수 없으므로 container를 삭제한 후 삭제하여야 한다.

#docker rmi [CONTAINER]
docker rmi mariadb

여러 개를 삭제하고 싶은 경우 image를 여러 개 열거한다.

docker rmi mariadb rabbitmq jenkins

rm과 rmi의 예제를 보고 헷갈릴 수 있는데 rm은 container를 삭제하는 것이고 rmi는 image를 삭제하는 것이다.

mariadb, rabbitmq, jenkins라는 이름을 동일하게 사용하였지만 rm에서는 container name을 지정하여 삭제한 경우이고 rmi에서는 image name을 지정하여 삭제한 경우이다. (예제는 단순히 container name과 image name이 같다고 가정하고 설명하였다.)

pull

image를 가져온다.

#docker pull [IMAGE]
docker pull mariadb

보통 run 명령어를 사용하면 해당 기능까지 같이 수행하기 때문에 자주 쓰지 않게 되는 것 같다.

image history

이미지의 history를 확인한다.

생성된 용량을 확인할 수 있다.

#docker image history [IMAGE]
docker image history mariadb

push

생성된 이미지를 registry에 업로드한다.

docker hub에 업로드하는 경우도 있고 혹은 따로 구축한 repository에 업로드하는 경우도 있다.

push를 위해선 login이 선행되어야 한다.

#docker push [OPTIONS] NAME[:TAG]
docker push 내이미지

login

push 할 registry에 login을 한다.

#docker login [OPTIONS] [SERVER]
docker login localhost:8083

서버를 지정하지 않으면 docker hub로 로그인을 한다.

push를 하는 경우 로그인을 한 후 push 시 [SERVER]/[IMAGE]:[TAG]를 지정하여 업로드 처리를 한다.

위와 같이 localhost:8083에 업로드하는 경우 아래처럼 push 한다.

docker push localhost:8083/bluesky-someimage:latest

tag

bluesky-someimage:latest라는 이미지를 생성한 경우서 push를 위해선 서버를 지정하기 위해 tag를 사용한다.

#docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag bluesky-someimage:latest localhost:8083/bluesky-someimage:latest

위와 같이 사용하면 localhost:8083/bluesky-someimage:latest 란 태그가 붙은 이미지가 링크되고 해당 이미지를 push 하면 지정된 repository로 업로드하게 된다.

sytstem 관련 명령어

events

도커 데몬에서 어떤 일이 일어나고 있는지 실시간 스트림 로그로 확인 (아래 둘 중 하나를 사용)

docker system events
docker events

만약 특정 항목에 대한 출력 결과만 보고 싶은 경우 --filter 옵션 사용

docker events --filter 'type=image'

stats

실행 중인 모든 container의 자원 사용량을 스트림으로 출력

docker stats
CONTAINER ID   NAME                                                                                                                                    CPU %     MEM USAGE / LIMIT     MEM %     NET I/O   BLOCK I/O         PIDS
42974ae6b3de   k8s_jenkins_jenkins-deployment-5588f7bb5c-g5dsl_default_fa3b66be-cb49-4878-b46c-1feed41f564e_0                                          0.06%     663.1MiB / 7.007GiB   9.24%     0B / 0B   129MB / 3.36MB    39
f78d2227ac3a   k8s_zoo3_zoo3-c46589699-pcrgn_default_4913bdf9-3c6d-420e-ab21-57c13d7817d3_5                                                            0.09%     84.12MiB / 7.007GiB   1.17%     0B / 0B   36.6MB / 20.5kB   46
65927c7c5d35   k8s_redis_redis-deployment-c96fb6784-qb6gn_default_581f2b98-2dd0-457b-87c2-1a14cfc06b52_11                                              0.08%     2.039MiB / 7.007GiB   0.03%     0B / 0B   9.11MB / 0B       5
a1107316f2e2   k8s_zoo1_zoo1-65cff9f54c-bqmdr_default_893412ca-d476-4093-aae4-b031ed40e62d_5                                                           0.07%     49.63MiB / 7.007GiB   0.69%     0B / 0B   10.5MB / 16.4kB   38
236f6e932a9d   k8s_mariadb_mariadb-deployment-79b57c4d79-fr576_default_374d6934-6ba9-4bd4-9b27-07e9a9dfef65_18                                         0.01%     28.57MiB / 7.007GiB   0.40%     0B / 0B   57.7MB / 19MB     8
e091bd863d44   k8s_zoo2_zoo2-67669cb7f-m68x7_default_3df5ebb2-fedb-4be6-9253-64e9e45252cb_5                                                            0.05%     65.04MiB / 7.007GiB   0.91%     0B / 0B   63MB / 24.6kB     38
5a39902ec10e   k8s_mongo_mongo-deployment-6ff7cd6656-zc24r_default_bbbf56a4-d0f6-485c-a547-b9860e975bad_18                                             0.22%     31.82MiB / 7.007GiB   0.44%     0B / 0B   79.1MB / 163MB    32
173ff76869f2   k8s_nexus_nexus-deployment-557b544497-t6hf4_default_1cd3d78d-67cf-4c49-8b7e-c848faa13db8_18                                             0.27%     1.379GiB / 7.007GiB   19.67%    0B / 0B   272MB / 147kB     93
33dd67c01f0d   k8s_zeppelin_zeppelin-deployment-b7875cd89-vv9jt_default_6cfe9831-4832-408c-912d-63af12a090ad_18                                        0.28%     365.3MiB / 7.007GiB   5.09%     0B / 0B   255MB / 106kB     24
39b808663fa1   k8s_spring_bluesky-cloud-config-server-deployment-766cfcd769-sr24h_default_2b3136e7-db3f-451f-970a-0149884976b5_18                      0.03%     248.5MiB / 7.007GiB   3.46%     0B / 0B   69.1MB / 13.1MB   47
2c47c876b355   k8s_bluesky-cloud-admin-server_bluesky-cloud-admin-server-deployment-7bfcc88d68-wf5sk_default_b0556eaf-22c7-4462-b682-34a4b3aae356_18   0.07%     266.3MiB / 7.007GiB   3.71%     0B / 0B   87.1MB / 86kB     46
66d5e5271975   k8s_spring_bluesky-cloud-netflix-eureka-server-deployment-5878b6bcd5-q7h9q_default_3bcc4ec0-d751-4083-a97f-34085228ea1d_18              0.30%     214.4MiB / 7.007GiB   2.99%     0B / 0B   112MB / 0B        68
3273f2dd00a5   k8s_mssql_mssql-deployment-999b7c7b9-q5z5h_default_f26c048b-3137-454b-9075-feeb39abc627_18                                              0.59%     966.1MiB / 7.007GiB   13.46%    0B / 0B   1.36GB / 1.56MB   143

스트림이 아닌 한 번만 출력을 원하는 경우 --no-stream 옵션 사용

docker stats --no-stream

df

docker에서 사용하고 있는 image, container, volume의 현황 확인

docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          128       21        49.99GB   41.19GB (82%)
Containers      86        45        4.469MB   562.3kB (12%)
Local Volumes   239       24        29.66GB   28.75GB (96%)
Build Cache     157       0         213B      213B

 

삭제 관련 명령어

오래된 container나 image를 삭제할 때 rm, rmi 또는 image prune 명령어를 사용한다.

다음과 같이 조합하여 사용한다.

사용하지 않는 conatiner 삭제

docker rm -v $(docker ps --filter status=exited -q --no-trunc 2>/dev/null) 2>/dev/null

사용하지 않는 image 삭제

dangling=true 옵션은 tag가 <none>으로 설정된 이미지를 검색한다.

https://docs.docker.com/engine/reference/commandline/images/

docker rmi $(docker images --filter dangling=true -q --no-trunc 2>/dev/null) 2>/dev/null

날짜 기준 이미지 삭제

지정된 날짜 또는 일정 시간 이전의 이미지를 강제로 삭제할 수 있다.

docker image prune -a --force --filter "until=2017-01-04T00:00:00"
docker image prune -a --force --filter "until=8760h"    // 24*365

 

반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요