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 : https://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 Desktop - 사전 실행 : https://coding-mid-life.tistory.com/89 을 참고하고 먼저 실행하여야 Doker가 오픈된다
- PowerShell에 아래 명령을 입력하여 docker/whalesay을 다운받는다
- image pull : 레지스트리에서 이미지 혹은 레포지토리를 가져온다
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 명령을 이용하여 [커맨드] 구동한 Docker Container를 commit 한다
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 이 생성됭 것을 확인할 수 있다
'클라우드' 카테고리의 다른 글
Cloud - 배포자동화(Automated Deployment) (0) | 2022.08.07 |
---|---|
Cloud - 배포 컨테이너 - Docker Image (0) | 2022.08.07 |
Docker Desktop - 사전 실행 (0) | 2022.08.05 |
Cloud - 배포 컨테이너 (0) | 2022.08.05 |
Cloud - AWS 실습 - 데이터베이스 연결 (0) | 2022.08.04 |