Precaution

  • Ubuntu 운영체제로 실습을 진행하는 경우, 관리자 권한(sudo)으로 Docker 명령어를 실행해야 한다
  • 진행 중에 permission denied 메시지가 포함된 오류가 발생하면 sudo 를 명령어 앞에 붙여서 관리자 권한을 부여한다

 

1. Docker CLI(Command Line Interface)

 

docker container run

docker container run: Run a command in a new container

docs.docker.com

도커를 이용하는 데 있어서 명령어, 옵션 등 사용법은 Docker docs에서 확인할 수 있다

Docker CLI 관련 정보뿐만 아니라 Docker의 전반적인 사용법과 환경을 구성하는 방법에 대해서도 확인할 수 있다
- 사용법 : Docker CLI, Docker-Compose CLI, API Reference
- 환경 및 빌드 파일 구성 : DockerFile, Docker-Compose File

 

 

 

2. Docker 명령

 1) 실행 명령

docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
  • Option
Option Default Description
--add-host   사용자 지정 호스트-IP 매핑 추가(host:ip)
--attach,-a   STDIN, STDOUT 또는 STDERR에 연결
--blkio-weight   차단 IO(상대 가중치), 10~1000, 비활성화하려면 0(기본값 0)
--blkio-weight-device   블록 IO 가중치(상대 장치 가중치)
--cap-add   Linux 기능 추가
--cap-drop   Linux 기능 중단
--cgroup-parent   컨테이너에 대한 선택적 상위 cgroup
--cgroupns   API 1.41+
사용할 Cgroup 네임스페이스(host|private) 'host': Docker 호스트의 cgroup 네임스페이스에서 컨테이너를 실행 'private': 자체 private cgroup 네임스페이스에서 컨테이너를 실행합니다. '': default-cgroupns-에 의해 구성된 대로 cgroup 네임스페이스를 사용합니다. 데몬의 모드 옵션(기본값)
--cidfile   파일에 컨테이너 ID 쓰기
--cpu-count   CPU 수(Windows만 해당)
--cpu-percent   CPU 백분율(Windows만 해당)
--cpu-period   CPU CFS(Completely Fair Scheduler) 기간 제한
--cpu-quota   CPU CFS(Completely Fair Scheduler) 할당량 제한
--cpu-rt-period   마이크로초 단위의 CPU 실시간 기간 제한
--cpu-rt-runtime   마이크로초 단위로 CPU 실시간 런타임 제한
--cpu-shares,-c   CPU 공유(상대 가중치)
--cpus   CPU 수
--cpuset-cpus   실행을 허용할 CPU(0-3, 0,1)
--cpuset-mems   실행을 허용할 MEM(0-3, 0,1)
--detach,-d   백그라운드에서 컨테이너 실행 및 컨테이너 ID 인쇄
--detach-keys   컨테이너 분리를 위한 키 시퀀스 재정의
--device   컨테이너에 호스트 장치 추가
--device-cgroup-rule   cgroup 허용 장치 목록에 규칙 추가
--device-read-bps   장치의 읽기 속도(초당 바이트 수) 제한
--device-read-iops   장치의 읽기 속도(초당 IO) 제한
--device-write-bps   장치에 대한 쓰기 속도(초당 바이트 수) 제한
--device-write-iops   장치에 대한 쓰기 속도(초당 IO) 제한
--disable-content-trust true 이미지 확인 건너뛰기
--dns   사용자 지정 DNS 서버 설정
--dns-opt   DNS 옵션 설정
--dns-option   DNS 옵션 설정
--dns-search   사용자 지정 DNS 검색 도메인 설정
--domainname   컨테이너 NIS 도메인 이름
--entrypoint   이미지의 기본 ENTRYPOINT를 덮어씁니다.
--env,-e   환경 변수 설정
--env-file   환경 변수 파일에서 읽기
--expose   포트 또는 포트 범위 노출
--gpus   API 1.40+
컨테이너에 추가할 GPU 장치(모든 GPU를 전달하려면 'all')
--group-add   가입할 그룹 추가
--health-cmd   상태를 확인하기 위해 실행하는 명령
--health-interval   검사 실행 사이의 시간(ms|s|m|h)(기본값 0)
--health-retries   비정상 보고에 필요한 연속 실패
--health-start-period   상태 재시도 카운트다운을 시작하기 전에 컨테이너가 초기화되는 시작 기간(ms|s|m|h)(기본값 0)
--health-timeout   하나의 검사를 실행할 수 있는 최대 시간(ms|s|m|h)(기본값 0s)
--help   인쇄 사용
--hostname,-h   컨테이너 호스트 이름
--init   신호를 전달하고 프로세스를 거두는 컨테이너 내부에서 init 실행
--interactive,-i   연결되지 않은 경우에도 STDIN을 열어 두십시오.
--io-maxbandwidth   시스템 드라이브의 최대 IO 대역폭 제한(Windows만 해당)
--io-maxiops   시스템 드라이브의 최대 IOPS 제한(Windows만 해당)
--ip   IPv4 주소(예: 172.30.100.104)
--ip6   IPv6 주소(예: 2001:db8::33)
--ipc   사용할 IPC 모드
--isolation   컨테이너 격리 기술
--kernel-memory   커널 메모리 제한
--label,-l   컨테이너에 메타 데이터 설정
--label-file   줄로 구분된 레이블 파일 읽기
--link   다른 컨테이너에 링크 추가
--link-local-ip   컨테이너 IPv4/IPv6 링크 로컬 주소
--log-driver   컨테이너용 로깅 드라이버
--log-opt   로그 드라이버 옵션
--mac-address   컨테이너 MAC 주소(예: 92:d0:c6:0a:29:33)
--memory,-m   메모리 제한
--memory-reservation   메모리 소프트 제한
--memory-swap   메모리 + 스왑과 동일한 스왑 제한: 무제한 스왑을 활성화하려면 '-1'
--memory-swappiness -1 컨테이너 메모리 스와핑 조정(0~100)
--mount   파일 시스템 마운트를 컨테이너에 연결
--name   컨테이너에 이름 할당
--net   컨테이너를 네트워크에 연결
--net-alias   컨테이너에 대한 네트워크 범위 별칭 추가
--network   컨테이너를 네트워크에 연결
--network-alias   컨테이너에 대한 네트워크 범위 별칭 추가
--no-healthcheck   컨테이너 지정 HEALTHCHECK 비활성화
--oom-kill-disable   OOM 킬러 비활성화
--oom-score-adj   호스트의 OOM 기본 설정 조정(-1000 ~ 1000)
--pid   사용할 PID 네임스페이스
--pids-limit   컨테이너 pid 제한 조정(무제한의 경우 -1로 설정)
--platform   서버가 다중 플랫폼을 지원하는 경우 플랫폼 설정
--privileged   이 컨테이너에 확장 권한 부여
--publish,-p   컨테이너의 포트를 호스트에 게시
--publish-all,-P   노출된 모든 포트를 임의의 포트에 게시
--pull missing 실행하기 전에 이미지 가져오기("항상"|"누락"|"절대")
--read-only   컨테이너의 루트 파일 시스템을 읽기 전용으로 마운트
--restart no 컨테이너 종료 시 적용할 재시작 정책
--rm   컨테이너가 종료되면 자동으로 제거
--runtime   이 컨테이너에 사용할 런타임
--security-opt   보안 옵션
--shm-size   /dev/shm의 크기
--sig-proxy true 프록시가 프로세스에 신호를 수신했습니다.
--stop-signal SIGTERM 컨테이너 중지 신호
--stop-timeout   컨테이너 중지 시간 초과(초)
--storage-opt   컨테이너에 대한 스토리지 드라이버 옵션
--sysctl   시스템 옵션
--tmpfs   tmpfs 디렉토리 마운트
--tty,-t   의사 TTY 할당
--ulimit   Ulimit 옵션
--user,-u   사용자 이름 또는 UID(형식: <name|uid>[:<group|gid>])
--userns   사용할 사용자 네임스페이스
--uts   사용할 UTS 네임스페이스
--volume,-v   볼륨 마운트 바인딩
--volume-driver   컨테이너용 옵션 볼륨 드라이버
--volumes-from   지정된 컨테이너에서 볼륨 마운트
--workdir,-w   컨테이너 내부의 작업 디렉토리
  • Parent Command
docker container Manage containers
  • Related Command
Command 단독 사용 시
docker container COMMAND
Command Description
docker container attach 실행 중인 컨테이너에 로컬 표준 입력, 출력 및 오류 스트림 연결
docker container commit 컨테이너의 변경 사항에서 새 이미지 만들기
docker container cp 컨테이너와 로컬 파일 시스템 간에 파일/폴더 복사
docker container create 새 컨테이너 만들기
docker container diff 컨테이너의 파일 시스템에서 파일 또는 디렉토리의 변경 사항 검사
docker container exec 실행 중인 컨테이너에서 명령 실행
docker container export 컨테이너의 파일 시스템을 tar 아카이브로 내보내기
docker container inspect 하나 이상의 컨테이너에 대한 자세한 정보 표시
docker container kill 하나 이상의 실행 중인 컨테이너 종료
docker container logs 컨테이너의 로그 가져오기
docker container ls 컨테이너 나열
docker container pause 하나 이상의 컨테이너 내 모든 프로세스 일시 중지
docker container port 컨테이너에 대한 포트 매핑 또는 특정 매핑 나열
docker container prune 중지된 모든 컨테이너 제거
docker container rename 컨테이너 이름 바꾸기
docker container restart 하나 이상의 컨테이너 다시 시작
docker container rm 하나 이상의 컨테이너 제거
docker container run 새 컨테이너에서 명령 실행
docker container start 하나 이상의 중지된 컨테이너 시작
docker container stats 컨테이너 리소스 사용 통계의 라이브 스트림 표시
docker container stop 하나 이상의 실행 중인 컨테이너 중지
docker container top 컨테이너의 실행 중인 프로세스 표시
docker container unpause 하나 이상의 컨테이너 내의 모든 프로세스 일시 중지 해제
docker container update 하나 이상의 컨테이너 구성 업데이트
docker container wait 하나 이상의 컨테이너가 중지될 때까지 차단한 다음 종료 코드를 인쇄합니다.

 

2. Docker 실습 - 이미지 실행

 1) docker/whalesay

  • docker/whalesay 라는 이미지로 실습한다
  • 제공된 이미지 docker/whalesay는 레지스트리 계정, 레포지토리 이름, 태그 세 가지 정보로 구성되어 있다

  • 레지스트리(Registry)
    - Docker Hub : https://hub.docker.com/
    - 도커 이미지를 관리하는 공간이다
    - 별도로 지정하지 않으면 도커 허브(Docker Hub)를 기본 레지스트리로 설정한다
    - 레지스트리는 Docker Hub, Private Docker Hub, 회사 내부용 레지스트리 등으로 나눌 수 있다
  • 레포지토리(Repository)
    - 레지스트리 내에 도커 이미지가 저장되는 공간이다
    - 이미지 이름이 사용되기도 한다
    - GitHub의 레포지토리와 유사하다
  • 태그(Tag)
    - 동일한 이미지도 버전 별로 안의 내용이 다를 수 있다
    - 해당 이미지를 설명하는 버전 정보를 입력한다
    - 별도로 지정하지 않으면 latest 태그를 붙인 이미지를 가져온다
  • docker/whalesay:latest 이미지 정보를 해석하면
    - Docker Hub 레지스트리에서
    - docker라는 유저가 등록한 whalesay 이미지 혹은 레포지토리에서
    - latest 태그를 가진 이미지이다
  • 이미지 : https://hub.docker.com/r/docker/whalesay
 

Docker Hub

 

hub.docker.com

 

Docker Hub Container Image Library | App Containerization

We and third parties use cookies or similar technologies ("Cookies") as described below to collect and process personal data, such as your IP address or browser information. You can learn more about how this site uses Cookies by reading our privacy policy

hub.docker.com

 

 

 2) Docker 레포지토리 생성

  • Docker에 가입한다
  • Repository를 생성한다

  • 정상적으로 레포지토리가 생성되었다

 

 

 

3) 이미지 실습 : docker/whalesay

docker image pull docker/whalesay:latest

  • 도커에 있는 이미지 리스트를 출력한다
docker image ls

  • 이미지를 실행한다
    - {container} run
      : 컨테이너를 실행한다
    - [OPTIONS]
      : -name : 컨테이너의 이름을 할당한다
    - [COMMAND]
      : command는 초기 컨테이너 실행 시 수행되는 명령어이다
      : cowsay : 컨테이너 실행 시 cowsay 명령어를 호출하며, node를 호출하듯 이용한다
    - [ARG..]
      : boo : COMMAND인 cowsay에 넘겨질 파라미터이다
docker container run 사용법
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]

예시
docker container run --name 컨테이너_이름

docker/whalesay 실행 명령
docker container run docker/whalesay:latest cowsay boo

 

 3-1) 대표 명령문

  • 도커에 있는 컨테이너 리스트를 출력한다
    - a : Default 로는 실행되는 컨테이너지만 종료된 컨테이너를 포함하여 모든 컨테이너를 출력한다
docker container ps -a

  • 도커에 있는 컨테이너를 삭제한다 
    - {container} rm : 컨테이너를 지정하여 삭제한다
    - 컨테이너를 지정 삭제할 경우에는 ps 명령으로 NAMES 또는 CONTAINER ID 를 확인한 후 사용한다
docker container rm 컨테이너_이름
  • 지정된 도커의 이미지를 삭제한다
docker image rm docker/whalesay

 

  • 연속 작업을 실행한다
    - {container} run : 컨테이너를 실행한다
    - 이미지가 없다면 이미지를 받아온 뒤(pull) 실행한다
    - -rm : 컨테이너를 일회성으로 실행한다
      : 컨테이너가 중지되거나 종료될 때, 컨테이너와 관련된 리소스를 모두 제거한다
docker container run --name 컨테이너_이름 --rm docker/whalesay cowsay boo

 

 

 4) 파일 실습 : danielkraic/asciiquarium

  • danielkraic라는 사람이 올린 이미지 asciiquarium 를 실행한다
docker container run -it --rm danielkraic/asciiquarium:latest
  • [커맨드] danielkraic/asciiquarium 이미지를 실행합니다.
  • it : -i, -t 를 동시에 사용한 옵션이다
    - 사용자와 컨테이너 간에 인터렉션(interaction)이 필요할 경우 사용한다
    - 출력되는 화면을 사용자가 지속적으로 보기 위해 사용하였다
    - Python 명령이 필요하거나 추가로 다른 입력을 받는다면, 이 옵션을 지정한 뒤 사용한다
  • container는 ctrl + c 로 종료할 수 있다

 

 

3. Docker 컨테이너에 파일 복사

  • 게임 서버, 웹 서버와 같이 사용할 도구가 도커 이미지에 모두 구성되어 있지 않은 경우도 있다
    - 웹 서버는 도커 컨테이너로 실행하고,  웹 서버를 구성하는 파일은 직접 만들거나 가져온 파일로 구성될 수 있다
    - 장점
     : 서버에 발생한 문제를 호스트와 별개로 파악할 수 있다
     : 문제가 생긴 서버를 끄고, 공장 초기화를 하듯 도커 이미지로 서버를 재구동할 수 있다
  • 로컬에 있는 파일과 도커 이미지를 연결하는 방법은 크게 2가지로 나눈다
    - CP(Copy) : 호스트와 컨테이너 사이에 파일을 복사(Copy)하는 방법
    - Volume : 호스트와 컨테이너 사이에 공간을 마운트(Mount)하는 방법
      : 마운트는 저장 공간을 다른 장치에서 접근할 수 있도록 경로를 허용하여 하나의 저장 공간을 이용하는 것처럼 보이게 하는 작업이다

 1) httpd 웹 서버

  • 사용할 도커 이미지는 httpd(http daemon)이다
    - httpd(http daemon)은 Apache HTTP Server를 실행할 수 있는 오픈소스 웹 서버 소프트웨어이다
    - https://httpd.apache.org/ 
 

Welcome! - The Apache HTTP Server Project

The Number One HTTP Server On The Internet The Apache HTTP Server Project is an effort to develop and maintain an open-source HTTP server for modern operating systems including UNIX and Windows. The goal of this project is to provide a secure, efficient an

httpd.apache.org

  • httpd 는 /usr/local/apache2/htdocs/ 경로에 웹 서버와 관련된 파일들이 저장되어 있다면, 해당 파일을 기반으로 웹 서버가 실행되도록 한다
  • codestates-seb/be-pacman-canvas 레포지토리를 클론한다
    - [커맨드] be-pacman-canvas 레포지토리를 클론한다
git clone git@github.com:codestates-seb/be-pacman-canvas.git

또는 아래 파일을 클론한다

git clone https://github.com/codestates-seb/be-pacman-canvas.git

  • docker container run 명령어로 httpd 를 실행합니다.[커맨드] httpd를 실행한다 
    - -name : httpdserver 을 입력하여 아파치 서버로 지정한다
    - -p : 로컬호스트의 포트와 컨테이너의 포트를 연결한다
    - 818포트가 로컬호스트의 포트이고, 80번은 컨테이너의 포트이다
    - httpd 는 일정 시간 연결 기록이 없으면, 서버 가동이 중지된다
    - 실행 중이던 도커 컨테이너가 중지되면 다시 실행한다
    - 터미널에서 명령어를 입력했을 때, 아래 화면처럼 터미널의 작동이 중단된 것처럼 보여도 정상적인 상태이다
      : 터미널을 종료하지 말고, 다른 터미널 창을 열어 다른 작업을 수행한다
docker container run --name 컨테이너_이름 -p 818:80 httpd

docker container run --name httpdserver -p 818:80 httpd

  • -d 는 컨테이너를 백그라운드에서 실행하게 해주는 옵션이다
  • 127.0.0.1:818 또는 localhost:818 을 통해 웹 서버가 작동하고 있는지 확인한다
    - 127.0.0.1 과 localhost 를 이용하면 로컬 컴퓨터의 IP 주소로 redirecting 할 수 있다
    - DNS 설정으로 인해 localhost 로 접속이 안 되고 127.0.0.1 만 접속이 될 수 있다

 

  • 서버가 정상적으로 열린 것이 확인되면 새로운 터미널을 연다
  • docker container cp 명령어를 입력해 로컬호스트에 있는 파일을 컨테이너에 전달한다
    - 경로를 입력할 때, 상대 경로와 절대 경로를 주의한다
    - docker container cp 명령은 앞에 있는 경로의 파일을 뒤에 있는 경로에 복사한다
지정된 경로에서 명령어를 입력한다

//src/main/resource/template
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/

//src/main/resource/static
docker container cp ./ 컨테이너_이름:/usr/local/apache2/htdocs/

각각의 경로 위치에서 실행한다
  • 127.0.0.1:818 혹은 localhost:818 에 접속해서 게임 서버가 구동되는지 확인합니다.

  • 컨테이너를 다룰 때, 뭔가 제대로 되지 않는다면
    - docker exec -it 컨테이너_이름 bash 명령어를 통해 컨테이너 내부 터미널로 접속할 수 있다
    - 팩맨 실습에서는 컨테이너 속 '/usr/local/apache2/htdocs' 경로에 주의한다

 

 

4. Docker 이미지 만들기

  • Docker Container를 이미지 파일로 변환한다
  • 이미지로 변환하면
    - 이전에 작업했던 내용을 다시 한 번 수행하지 않아도 된다
    - 배포 및 관리가 유용하다

 1) 구동한 Docker Container를 이미지로 만드는 방법

docker container commit 컨테이너_이름 my_pacman:1.0

 

  •  docker image ls 명령어로 이미지가 만들어진 것을 확인한다

 

  • 생성된 이미지를 900 포트에서 웹 서버로 구동한다
    - [커맨드] 900 포트에서 웹 서버로 이미지를 구동한다
docker run --name my_web2 -p 900:80 my_pacman:1.0
  • 127.0.0.1:900 또는 localhost:900 을 통해 웹 서버가 작동하고 있는지 확인한다

 

2) Docker Image 빌드를 위한 파일인 Dockerfile 로 만드는 방법

https://docs.docker.com/engine/reference/builder/ 

 

Dockerfile reference

 

docs.docker.com

 

  • Dockerfile 을 만들고, Dockerfile 대로 이미지를 build 하는 방법이다
  • Dockerfile 은 이미지 파일의 설명서다
  • Dockerfile로 pacman 이미지를 생성한다
    - COPY 구문에서 Dockerfile의 생성 위치를 확인한다
베이스 이미지를 httpd:2.4 로 사용합니다.
FROM httpd:2.4

호스트의 현재 경로에 있는 파일을 생성할 이미지 /usr/local/apache2/htdocs/ 에 복사한다
COPY ./ /usr/local/apache2/htdocs/

 

  • docker build 명령어는 Dockerfile로 도커 이미지 파일을 생성할 때 사용한다
--tag 는 name:tag 형식으로 이미지를 생성할 수 있다
지정한 경로에 있는 Dockerfile을 찾아서 빌드한다

docker build --tag my_pacman:2.0 .

"."을 명령어에 꼭 포함해야 한다

 

  • 생성된 이미지를 이용해 901 포트에 웹 서버를 구동한다
docker run --name my_web3 -p 901:80 my_pacman:2.0
  • 127.0.0.1:901 또는 localhost:901 을 통해 웹 서버가 작동하고 있는지 확인한다
    - Docker Desktop 에 my_web3 이름으로 port 901 이 생성됭 것을 확인할 수 있다

 

 

+ Recent posts