서버 운영 관리

차동훈 에반젤리스트

Docker 기본 명령어

1. Docker 기본 명령어

Docker의 명령은 docker run, docker push와 같이 docker <명령> 형식 입니다.

 

1-1 이미지 관련 명령어

이미지 검색

docker search <이미지 이름>

- 보통 Ubuntu, CentOS, Redis OS나 프로그램 이름을 가진 이미지가 공식 이미지 입니다.

- 나머지는 사용자들이 만들어서 공개한 이미지 입니다.

[root@localhost ~]# docker search centos

NAME DESCRIPTION STARS OFFICIAL AUTOMATED

centos The official build of CentOS. 4392 [OK]

ansible/centos7-ansible Ansible on Centos7 113 [OK]

jdeathe/centos-ssh CentOS-6 6.9 x86_64 / CentOS-7 7.4.1708 x86_… 97 [OK]

consol/centos-xfce-vnc Centos container with "headless" VNC session… 55 [OK]

tutum/centos Simple CentOS docker image with SSH access 42

imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 41 [OK]

gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glust… 30 [OK]

centos/mysql-57-centos7 MySQL 5.7 SQL database server 28

openshift/base-centos7 A Centos7 derived base image for Source-To-I… 27

centos/python-35-centos7 Platform for building and running Python 3.5… 24

kinogmt/centos-ssh CentOS with SSH 21 [OK]

centos/postgresql-96-centos7 PostgreSQL is an advanced Object-Relational … 19

openshift/jenkins-2-centos7 A Centos7 based Jenkins v2.x image for use w… 13

centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or bui… 13

openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6

openshift/jenkins-1-centos7 DEPRECATED: A Centos7 based Jenkins v1.x ima… 4

pivotaldata/centos-gpdb-dev CentOS image for GPDB development. Tag names… 4

darksheer/centos Base Centos Image -- Updated hourly 3 [OK]

openshift/wildfly-101-centos7 A Centos7 based WildFly v10.1 image for use … 3

pivotaldata/centos Base centos, freshened up a little with a Do… 2

blacklabelops/centos CentOS Base Image! Built and Updates Daily! 1 [OK]

pivotaldata/centos-mingw Using the mingw toolchain to cross-compile t… 1

smartentry/centos centos with smartentry 0 [OK]

jameseckersall/sonarr-centos Sonarr on CentOS 7 0 [OK]

 

이미지 받아오기

docker pull <이미지 이름>:<태그>

- Docker Hub에서 ubuntu 이미지를 받아보겠습니다.

- 이미지 이름 뒤에 latest를 설정하면 최신 버전을 받을 수 있습니다.

- Ubuntu:14.04, Ubuntu12.10 처럼 태그를 지정할 수 있습니다.

- 이미지 이름에서 91jos/ubuntu처럼 / 앞에 사용자명을 지정하면 해당 사용자가 올린 이미지를 받을 수 있습니다.

[root@localhost ~]# docker pull ubuntu:latest

latest: Pulling from library/ubuntu

6b98dfc16071: Pull complete

4001a1209541: Pull complete

6319fc68c576: Pull complete

b24603670dc3: Pull complete

97f170c87c6f: Pull complete

Digest: sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d

Status: Downloaded newer image for ubuntu:latest

 

이미지 목록 출력하기

docker images

- 다운받은 이미지 목록을 출력합니다.

[root@localhost ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

ubuntu latest 113a43faa138 2 weeks ago 81.1MB

 

이미지를 파일로 출력하기

docker save <이미지 이름> > <이름>.tar

[root@localhost ~]# docker save ubuntu:latest > ubuntu:latest.tar

[root@localhost ~]# ll

합계 81720

-rw-r--r-- 1 root root 83680768 625 14:12 ubuntu:latest.tar

 

이미지 삭제하기

docker rmi <이미지 이름>:<태그>

- 태그를 지정하지 않고 이미지 이름만 지정하였을땐 이미지 이름을 가진 모든 이미지가 삭제 됩니다.

[root@localhost ~]# docker rmi ubuntu:latest

Untagged: ubuntu:latest

Untagged: ubuntu@sha256:5f4bdc3467537cbbe563e80db2c3ec95d548a9145d64453b06939c4592d67b6d

Deleted: sha256:113a43faa1382a7404681f1b9af2f0d70b182c569aab71db497e33fa59ed87e6

Deleted: sha256:a9fa410a3f1704cd9061a802b6ca6e50a0df183cb10644a3ec4cac9f6421677a

Deleted: sha256:b21f75f60422609fa79f241bf80044e6e133dd0662851afb12dacd22d199233a

Deleted: sha256:038d2d2aa4fb988c06f04e3af208cc0c1dbd9703aa04905ade206d783e7bc06a

Deleted: sha256:b904d425ea85240d6af5a6c6f145e05d5e0127f547f8eb4f68552962df846e81

Deleted: sha256:db9476e6d963ed2b6042abef1c354223148cdcdbd6c7416c71a019ebcaea0edb

 

> dockerfile로 이미지 생성하기

docker build <옵션> 경로>

- 아래 작성한 Dockerfile로 이미지 생성하겠습니다.

- Dockerfile이 저장된 docker 디렉토리에서 명령어 실행

- --tag 옵션으로 이미지 이름과 태그를 설정할 수 있습니다.

[root@localhost local]# mkdir docker

[root@localhost local]# cd docker/

[root@localhost docker]# vi dockerfile

 

FROM ubuntu:14.04

MAINTAINER Foo Bar 91jos@naver.com

 

RUN apt-get update

RUN apt-get install -y nginx

RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

RUN chown -R www-data:www-data /var/lib/nginx

 

VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]

 

WORKDIR /etc/nginx

 

CMD ["nginx"]

 

EXPOSE 80

EXPOSE 443

 

 

[root@localhost docker]# docker build --tag docker_test:0.1 .

Sending build context to Docker daemon 2.048kB

Step 1/11 : FROM ubuntu:14.04

14.04: Pulling from library/ubuntu

 

Successfully built 5e397b69fee8

Successfully tagged docker_test:0.1

 

 

[root@localhost docker]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

docker_test 0.1 5e397b69fee8 About a minute ago 266MB => 이미지 생성완료

ubuntu 14.04 578c3e61a98c 2 weeks ago 223MB

ubuntu latest 113a43faa138 2 weeks ago 81.1MB

 

컨테이너를 이미지로 만들기

docker commit <컨테이너 이름> <이미지 이름>:<태그>

[root@localhost ~]# docker commit smile smile_image:0.1

sha256:afdf27d4bd445e8848ad5d307cbd15154ba04f293707a337b7b81f9cc2dcc33f

 

[root@localhost ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

smile_image 0.1 afdf27d4bd44 4 seconds ago 181MB

docker_test 0.1 5e397b69fee8 31 hours ago 266MB

ubuntu 14.04 578c3e61a98c 2 weeks ago 223MB

ubuntu latest 113a43faa138 2 weeks ago 81.1MB

 

 

1-2 컨테이너 관련 명령어

> run 명령어로 컨테이너 생성하기

docker run <옵션> <이미지 이름> <실행할 파일>

- ubuntu 이미지를 컨테이너로 생성한 뒤 ubuntu 이미지 /bin/bash 를 실행

- -i, -t 옵션을 사용하면 실행된 bash 쉘에 입력 및 출력 가능

- --name 옵션으로 컨테이너에 이름을 지정할 수 있음, 이름을 지정하지 않으면 docker가 자동으로 이름을 생성하여 지정

- cd, ls 명령으로 컨테이너 내부를 둘러본 뒤 exit를 입력하여 bash 쉘에서 나올 수 있습니다.

- 우분투 이미지에서 /bin/bash 실행 파일을 실행했기 때문에 여기서 나오면 컨테이너가 stop 됩니다.

[root@localhost ~]# docker run -i -t --name smile ubuntu /bin/bash

root@9d1213227a9e:/#

root@9d1213227a9e:/# ls

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

root@9d1213227a9e:/# exit

 

위에 run 명령어로 컨테이너 생성시 몇 가지 옵션들 입니다.

-a, --attach=” “

=> “stdin” : 컨테이너에 표준 입력 연결

=> “stdout” : 컨테이너에 표준 출력 연결

=> “stderr” : 컨테이너에 표준 에러 연결

 

-c, --cpu-shares=0

=> CPU 자원 분배 설정 입니다. 기본 값은 1024 이며 각 값은 상대적으로 적용 됩니다.

=> --cpu-shares=2048로 설정하면 기본 값 보다 두 배 많은 CPU 자원을 할당합니다.

 

-d, --detach=false : 컨테이너가 백그라운드로 실행됩니다.

--device=”<호스트 장치>:<컨테이너 장치> : 호스트의 장치를 컨테이너에서 사용할 수 있도록 연결합니다.

--device=”/dev/sda1:/dev/sda1” 처럼 설정하면 호스트의 /dev/sda1 블록 장치를 컨테이너에서도 사용할 수 있습니다.

 

-h, --hostname=” “ : 컨테이너의 호스트 이름을 설정 합니다.

 

-m, --memory=” “ : 메모리 한계를 설정합니다.

=> <숫자><단위> 형식이며 단위는 b, k, m, g를 사용할 수 있습니다.

 

--net=” ” : 컨테이너의 네트워크 모드를 설정합니다.

=> bridge : docker 네트워크 브리지에 새 네트워크를 생성합니다.

=> none : 네트워크를 사용하지 않습니다.

 

컨테이너 목록 확인하기

docker ps

- 모든 컨테이너 목록 출력이 가능합니다.

- 위에서 컨테이너를 생성할 때 이름을 smile로 지정했으므로 컨테이너 목록에서도 smile이 표시 됩니다.

- -a 옵션을 사용하면 정지된 컨테이너까지 모두 출력 됩니다.

- 옵션을 사용하지 않으면 실행되고 있는 컨테이너만 출력 됩니다.

[root@localhost ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

[root@localhost ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

9d1213227a9e ubuntu "/bin/bash" 2 minutes ago Exited (127) About a minute ago smile

 

컨테이너 실행하기

docker start <컨테이너 이름>

- OS 부팅 처럼 컨테이너 실행

- restart로 재시작 가능 합니다.

[root@localhost ~]# docker start smile

smile

 

컨테이너에 접속하기

docker attach <컨테이너 이름>

- 위에 시작한 컨테이너에 접속하여 보겠습니다.

- 명령어를 실행한 뒤에 엔터를 한번 더 입력하면 bash 쉘이 표시 됩니다.

- bash 쉘에서 exit 또는 Ctrl+d를 입력하면 컨테이너가 정지 됩니다.

- Ctrl+p, Ctrl+q 를 입력하면 컨테이너를 정지하지 않고, 빠져나올 수 있습니다.

[root@localhost ~]# docker attach smile

root@9d1213227a9e:/#

root@9d1213227a9e:/#

 

외부에서 컨테이너 안의 명령 실행하기

docker exec <컨테이너 이름> <명령> <매개 변수>

- 현재 컨테이너가 /bin/bash로 실행된 상태 입니다.

- /bin/bash를 통하지 않고 외부에서 컨테이너 안의 명령을 실행하겠습니다.

[root@localhost ~]# docker exec smile echo "hello"

hello

 

컨테이너 정지하기

docker stop <컨테이너 이름>

[root@localhost ~]# docker stop smile

smile

[root@localhost ~]# docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

 

컨테이너 삭제하기

docker rm <컨테이너 이름>

[root@localhost ~]# docker rm smile

smile

[root@localhost ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

 

컨테이너 내의 파일을 로컬에 복사하기

docker cp <컨테이너 이름>:/복사할 파일 위치/파일이름 /복사받을 파일 위치/파일 이름

[root@localhost ~]# docker cp smile:/etc/issue /usr/local/src/docker_test

[root@localhost ~]# ll /usr/local/src/

합계 4

-rw-r--r-- 1 root root 24 424 17:34 docker_test

 

컨테이너 생성 후 이미지로부터 변경된 파일 확인하기

docker diff <컨테이너 이름>

[root@localhost ~]# docker diff smile

C /lib

C /lib/x86_64-linux-gnu

A /lib/x86_64-linux-gnu/libhistory.so.7

A /lib/x86_64-linux-gnu/libexpat.so.1.6.7

A /lib/x86_64-linux-gnu/libreadline.so.7.0

A /lib/x86_64-linux-gnu/libexpat.so.1

A /lib/x86_64-linux-gnu/libhistory.so.7.0

A /lib/x86_64-linux-gnu/libreadline.so.7

C /usr

C /usr/share

A /usr/share/readline

A /usr/share/readline/inputrc

A /usr/share/vim

A /usr/share/vim/addons

A /usr/share/vim/addons/plugin

A /usr/share/vim/addons/plugin/editexisting.vim

 

=> 컨테이너 생성 후 apt-get update vim을 설치하여 위 같이 변경된 파일이 나타났습니다.

 

컨테이너 세부 정보 확인하기

docker inspect

- 이미지와 컨테이너의 세부 정보를 출력합니다.

[root@localhost ~]# docker inspect smile

[

{

"Id": "be3291c0e07fa8a1e78b4def2b87310e539532a3892b9fc318df5b593cd8896c",

"Created": "2018-06-25T05:14:33.567424159Z",

"Path": "/bin/bash",

"Args": [],

"State": {

"Status": "exited",

"Running": false,

"Paused": false,

"Restarting": false,

"OOMKilled": false,

"Dead": false,

"Pid": 0,

"ExitCode": 0,

"Error": "",

"StartedAt": "2018-06-25T05:17:09.124026456Z",

"FinishedAt": "2018-06-25T05:26:32.679370228Z"

},

"Image": "sha256:113a43faa1382a7404681f1b9af2f0d70b182c569aab71db497e33fa59ed87e6",

"ResolvConfPath": "/var/lib/docker/containers/be3291c0e07fa8a1e78b4def2b87310e539532a3892b9fc318df5b593cd8896c/resolv.conf",

"HostnamePath": "/var/lib/docker/containers/be3291c0e07fa8a1e78b4def2b87310e539532a3892b9fc318df5b593cd8896c/hostname",

"HostsPath": "/var/lib/docker/containers/be3291c0e07fa8a1e78b4def2b87310e539532a3892b9fc318df5b593cd8896c/hosts",

"LogPath": "/var/lib/docker/containers/be3291c0e07fa8a1e78b4def2b87310e539532a3892b9fc318df5b593cd8896c/be3291c0e07fa8a1e78b4def2b87310e539532a3892b9fc318df5b593cd8896c-json.log",

"Name": "/smile",

"RestartCount": 0,

"Driver": "devicemapper",

"Platform": "linux",

.

.

.

.

 

컨테이너를 파일로 출력하기

docker export <컨테이너 이름> > <컨테이너 이름>.tar

[root@localhost ~]# docker export smile > smile_container.tar

[root@localhost ~]# ll

합계 251360

-rw-r--r-- 1 root root 173709312 625 14:34 smile_container.tar