본문 바로가기
프로그래밍 놀이터/Settings

[Docker] Docker 명령 #1

by 돼지왕왕돼지 2020. 3. 22.

[Docker] Docker 명령 #1


4.1. Docker 이미지 조작


* Docker Hub


-

Docker Hub 는 GitHub 나  Bitbucket 같은 소스코드 관리 툴과 연계하여 코드를 빌드하는 기능이나 실행 가능한 앱의 이미지를 관리하는 기능을 갖춘 Docker 의 공식 리포지토리 서비스이다.

이를 사용하여 물리 서버, 가상 머신, 클라우드 모두 이미지를 배포할 수 있다.


hub.docker.com



-

이미지명은 아래의 format 을 갖는다.

이미지명[:태그명]

태그명에는 latest 를 지정할 수도 있다. latest 는 저장소에 공개되어 있는 최신판 이미지를 의미한다.



-

Docker Store 는 Docker 사가 제공하는 소프트웨어의 마켓 플레이스.

제공되는 소프트웨어는 Docker 포맷에서 미리 테스트된 멀웨어에 대한 검사를 통과하고 서명이 된 것을 배포한다.




* 이미지 다운로드 (docker image pull)


-

이미지 다운로드는 docker image pull 로 이루어짐


 syntax)

$ docker image pull [옵션] 이미지명[:태그명] # 이미지명 위치에 url 이 올 수도 있음


ex)

$ docker image pull centos:7 # CentOS 의 버전 7 을 다운로드

$ docker image pull -a centos # -a 는 모든 태그를 취득, 이미지명에 tag 를 지정할 수 없음




* 이미지 목록 표시


-

목록 표시는 docker image ls 로 이루어짐

syntax)

$ docker image ls [옵션] [리포지토리명]


주요 옵션은

-all, -a : 모든 이미지 표시

--digests : 다이제스트를 표시할지 말지

--no-trunc : 결과 모두 표시

--quite, -q : Docker 이미지 ID 만 표시



-

Docker 레지스트리에 업로드한 이미지는 이미지를 고유하게 식별하기 위한 다이제스트가 부여된다.

이를 표시하고 싶을 때 --digests 를 옵션으로 주면 된다.



-

Docker 에는 인프라 구성이 포함되기 때문에 악의를 가진 제삼자가 위장이나 변조를 하지 못하도록 이미지를 보호해야 한다.

Docker Content Trust(DCT)라는 기능을 이용하면 된다.

이미지 작성자가 Docker 레지스트리에 이미지를 업로드(docker image push)하기 전에 로컬 환경에서 이미지 작성자의 비밀키를 사용하여 이미지에 서명한다. 이 비밀키를 offline key 라고 한다.

서명이 된 이미지를 다운로드(docker image pull)할 때 이미지 작성자의 공개키를 사용하여 이미지가 진짜인지 아닌지를 확인한다. 변조된 경우 그 이미지를 무효로 만든다. 이 공개키를 tagging key 라고 한다.


DCT 기능을 사용하려면 DOCKER_CONTENT_TRUST 값을 세팅해준다.

$ export DOCKER_CONTENT_TRUST=1 # 0 값은 무효화




* 이미지 상세 정보 확인 (docker image inspect)


-

syntax)

$ docker image inspect 이미지명[:태그]



-

해당 이미지 정보 중 특정 정보를 원한다면 --format option 과 함께 아래와 같이 한다.

ex)

$ docker image inspect --format="{{.Os}}" centos:7




* 이미지 태그 설정(docker image tag)


-

이미지에 표식이 되는 태그를 붙이려면 docker image tag 명령을 사용한다.

이미지 태그에는 식별하기 쉬운 버전명을 붙이는 것이 일반적이다.

Docker Hub 에 작성한 이미지를 등록하려면 다음과 같은 규칙으로 이미지에 사용자명을 붙여야 한다.

<DockerHub 사용자명>/이미지명:[태그명]


syntax)

$ docker image tag <imageName> <dockerHub_userName>/<containerName>:<tagName>


ex)

$ docker image tag nginx testuser/webserver:1.0

이 tag 는 이미지에 별명을 붙일 뿐 이미지 자체를 복사하거나 이름을 바꾼 것은 아니라는 점을 주의해야 한다.




* 이미지 검색 (docker search)


-

Docker Hub 에 공개되어 있는 이미지를 검색할 때는 docker search 명령을 사용한다.

$ docker search [옵션] <검색 키워드>


주요 옵션은..

--no-trunc : 결과 모두 표시

--limit : n 건의 검색 결과 표시

--filter=stars=n : 즐겨찾기의 수(n 이상)를 지정


결과로 나오는 항목 중 AUTOMATED 는 Dockerfile 을 바탕으로 자동 생성된 이미지인지 아닌지를 이야기한다.




* 이미지 삭제 (docker image rm)


-

작성한 이미지를 삭제하려면 docker image rm 명령을 사용한다.


syntax)

$ docker image rm [옵션] 이미지명 [이미지명]


주요 옵션은..

--force, -f : 강제 삭제

--no-prune : 중간 이미지 삭제하지 않음


이미지명은 REPOSITORY 나 IMAGE ID 를 지정한다.






-

사용하지 않은 Docker 이미지를 삭제할 때는 docker image prune 명령을 사용한다.

$ docker image prune [옵션]


주요 옵션은..

--all, -a :  사용하지 않은 이미지 모두 삭제

--force, -f : 강제 삭제




* Docker Hub 에 로그인 (docker login)


-

Docker 리포지토리에 업로드하려면 docker login 명령을 사용하여 로그인한다.


syntax)

$ docker login [옵션] [서버]


주요 옵션은..

--password, -p : 비밀번호

--username, -u : 사용자명


옵션을 지정하지 않으면 알아서 prompt 로 사용자명과 비밀번호를 물어본다.

서버명을 지정하지 않으면 자동으로 Docker Hub 에 엑세스된다.




* 이미지 업로드 (docker image push)


-

syntax)

$ docker image push 사용자명/이미지명[:태그명]

push 전에 Docker Hub 에 계정을 만들고 docker login 명령으로 로그인해 둘 필요가 있다.




* Docker Hub 에서 로그아웃 (docker logout)


-

$ docker logout [서버명]





4.2. Docker 컨테이너 생성/시작/정지


* Docker 컨테이너의 라이프 사이클


-

컨테이너는 생성, 시작, 정지, 삭제의 라이프 사이클이 있다.



-

컨테이너 생성(docker container create 명령)

    이미지로부터 컨테이너를 생성한다.

    이미지의 실체는 Docker 에서 서버 기능을 동작시키기 위해 필요한 디렉토리 및 파일들이다.

    구체적으로는 Linux 의 작동에 필요한 /etc 나 /bin 등과 같은 디렉토리 및 파일들이다.


    docker container create 명령을 실행하면 컨테이너에 포함될 Linux 의 디렉토리와 파일들의 스냅샷을 취한다.

    이 명령은 컨테이너를 작성하기만 할 뿐 컨테이너를 시작하지는 않는다.



-

컨테이너 생성 및 시작(docker container run 명령)

    이미지로부터 컨테이너를 생성하고, 컨테이너 상에서 임의의 프로세스를 시작한다.



-

컨테이너 시작(docker container start 명령)

    정지 중인 컨테이너를 시작할 때 사용. 컨테이너 식별자를 지정하여 시작한다.



-

컨테이너 정지(docker container stop 명령)

    실행 중인 컨테이너를 정지시킬 때 사용한다. 컨테이너 식별자를 지정하여 정지한다.

    컨테이너를 삭제할 때는 stop 명령으로 실행중인 컨테이너를 정지시켜 둘 필요가 있다.

    재시작 하고 싶을 때는 docker container restart 명령을 사용한다.



-

컨테이너 삭제(docker container rm 명령)

    컨테이너를 삭제할 때 사용한다. 정지 중인 컨테이너 프로세스를 삭제한다.



-

container 상태 확인을 위한 docker container ps 명령과 일시 정지를 하는 docker container pause 명령 등이 있다.




* 컨테이너 생성 및 시작(docker container run)


-

Docker Container 의 생성 및 시작은 docker container run 으로 한다.

syntax)

$ docker container run [옵션] 이미지명[:태그명] [인수]


주요 옵션은..

--attach, -a : 표준 입력(stdin), 표준 출력(stdout), 표준 오류 출력(stderr)에 어태치한다.

--cidfile : container id 를 파일로 출력한다.

--detach, -d : 컨테이너를 생성하고 백그라운드에서 실행한다.

--interactive, -i : 컨테이너의 표준 입력을 연다.

--tty, -t : 단말기 디바이스를 사용한다.

--user, -u : 사용자명 지정

--restart=[no | on-failure | onfailure:횟수n | always | unless-stopped ] : 명령 실행 결과에 따라 재시작 옵션

--rm : 명령 실행 완료 후 컨테이너를 자동으로 삭제



-

ex)

$ docker container run -it --name "test1" centos /bin/cal

--name 을 생략하면 컨테이너 이름은 랜덤으로 자동 설정된다.

-i 옵션은 컨테이너의 표준 출력을 연다는 것이고, -t 옵션은 단말 디바이스를 확보한다는 뜻이다.

마지막 /bin/cal 은 실행할 명령이다.




* 컨테이너의 백그라운드 실행 (docker container run)


-

Docker 를 이용하는 경우의 대부분은 컨테이너에 서버 기능을 가지게 해서 실행하는 경우이다.

syntax)

$ docker container run [실행 옵션] 이미지명[:태그명] [인수]



-

백그라운드에서 실행되고 있는지 아닌지를 확인할 때는 docker container logs 명령을 사용한다.

syntax)

$ docker container logs -t <containerId>







* 컨테이너의 네트워크 설정(docker container run)


-

syntax)

$ docker container run [네트워크 옵션] 이미지명[:태그명] [인수]


주요 네트워크 옵션은...

--add-host=[호스트명:IP 주소] : /etc/hosts 에 호스트명과 IP 주소를 정의

--dns=[IP 주소] : 컨테이너 DNS 서버의 IP 주소 지정

--expose : 지정한 범위의 포트 번호 할당

--mac-address=[MAC 주소] : 컨테이너의 MAC 주소 지정

--net=[bridge | none | container:<name | id> | host | NETWORK] : 컨테이너 네트워크 지정

--hostname, -h : 컨테이너의 호스트명 지정

--publish, -p[호스트 포트 번호]:[컨테이너 포트 번호] : 호스트와 컨테이너 포트 매핑

--publish-all, -P : 호스트의 임의의 포트를 컨테이너에 할당



-

ex)

$ docker container run -d -p 8080:80 nginx # 호스트 포트 : 컨테이너 포트



-

Docker 에서는 기본적으로 호스트 OS 와 브리지 연결을 하지만 --net 옵션을 사용하면 다음과 같은 네트워크 설정이 가능하다.


bridge : 기본값으로 브리지 연결한다.

none : 네트워크 연결을 하지 않는다.

container:[name | id] : 다른 컨테이너의 네트워크를 사용한다.

host : 컨테이너가 호스트 OS 의 네트워크를 사용한다.

NETWORK : 사용자 정의 네트워크를 사용한다.



-

사용자 정의 네트워크는 docker network create 명령으로 작성한다.

이 네트워크를 작성하려면 Docker 네트워크 드라이버 또는 외부 네트워크 드라이버 플러그인을 사용해야 한다.


ex)

$ docker network create -d bridge webap-net # webap-net 이라는 네트워크 드라이버

$ docker container run --net=webap-net -it centos




* 자원을 지정하여 컨테이너 생성 및 실행 (docker container run)


-

syntax)

$ docker container run [자원 옵션] 이미지명[:태그명] [인수]


주요 옵션은..

--cpu-shares, -c : CPU 사용 배분(비율)

--memory, -m : 사용할 메모리를 제한하여 실행(단위응 b, k, m, g 중 하나)

--volume=[호스트 디렉토리]:[컨테이너 디렉토리], -v : 호스트와 컨테이너의 디렉토리를 공유



-

cpu-shares 의 기본값은 1024 이므로, CPU 시간을 반으로 할당하려면 512 로 설정한다.

ex)

$ docker container run --cpu-shares=512 --memory=1g -v /Users/aaa/webap:/usr/share/nginx/html nginx




* 컨테이너를 생성 및 시작하는 환경을 지정 (docker container run)


-

syntax)

$ docker container run [환경설정 옵션] 이미지명[:태그명] [인수]


주요  옵션은..

--env=[환경변수], -e : 환경변수 설정

--env-file=[파일명] : 환경변수를 파일로부터 설정

--read-only=[true | false] : 컨테이너의 파일 시스템을 읽기 전용으로 만든다.

--workdir=[패스], -w : 컨테이너의 작업 디렉토리를 지정한다.

-u, --user=[사용자명] : 사용자명 또는 UID 를 지정한다.



-

ex)

$ docker container run -it -e foo-bar -w=/tensorflow centos /bin/bash




* 가동 컨테이너 목록 표시 (docker container ls)


-

syntax)

$ docker container ls [옵션]


주요 옵션..

--all, -a : 실행 중/정지 중인 것도 포함하여 모든 컨테이너 표시

--filter, f : 표시한 컨테이너 필터링, key-value 로 지정한다.

--format : 표시 포맷 지정 (.ID .Image .Command .CreatedAt .RunningFor .Ports .Status .Size .Names .Mounts .Networks)

--last, -n : 마지막으로 실행된 n 건의 컨테이너만 표시

--latest, -l : 마지막으로 실행된 컨테이너만 표시

--no-trunc : 정보 생략 없이 표시

--quite, -q : 컨테이너 ID 만 표시

--size, -s : 파일 크기 표시



-

ex)

$ docker container ls -a --format "table {{.Names}}\t{{.Status}}\t{{.Mounts}}"







* 컨테이너 가동 확인 (docker container stats)


-

syntax)

$ docker container stats [컨테이너 식별자]


상태 화인이 끝나면 Ctrl + C 로 탈출한다.



-

컨테이너에서 실행 중인 프로세스를 확인할 때는 docker container top 명령을 사용한다.

ex)

$ docker container top webserver




* 컨테이너 시작(docker container start)


-

정지하고 있는 컨테이너를 시작할 때는 docker container start 명령을 사용한다.


syntax)

$ docker container start [옵션] <컨테이너 식별자> [컨테이너 식별자]


주요 옵션..

--attach, -a : 표준 출력, 표준 오류 출력을 연다.

--interactive, -i : 컨테이너의 표준 입력을 연다.




* 컨테이너 정지 (docker container stop)


-

실행 중인 컨테이너를 정지할 때는 docker container stop 명령을 사용한다.


syntax)

$ docker container stop [옵션] <컨테이너 식별자> [컨테이너 식별자]


주요 옵션

--time, -t : 컨테이너를 몇 초 후 정지 시킬 것인지 지정(기본값은 10초)



-

컨테이너를 강제로 정지시킬 때는 docker container kill 명령을 사용한다.




* 컨테이너 재시작(docker container restart)


-

syntax)

$ docker container restart [옵션] <컨테이너 식별자> [컨테이너 식별자]


주요 옵션

--time, -t : 컨테이너를 몇 초 후 재시작 시킬 것인지 지정(기본값 10초)




* 컨테이너 삭제 (docker container rm)


-

syntax)

$ docker container rm [옵션] <컨테이너 식별자> [컨테이너 식별자]


주요 옵션

--force, -f : 실행 중인 컨테이너 강제 삭제

--volumes, -v : 할당한 볼륨 삭제



-

정지중인 모든 컨테이너를 삭제하려면 docker container prune 을 사용한다.

$ docker container prune




* 컨테이너 중단/재개(docker container pause/unpause)


-

실행중인 컨테이너에서 작동 중인 프로세스를 모두 중단시킬 때는 docker continer pause 를 사용한다.

$ docker container pause <컨테이너 식별자>




댓글0