1. Container 관련 명령
1) Container로 애플리케이션 실행
- 이미지는 읽기 전용의 불변 값으로 만들어짐 (정적 - Class) 이러한 이미지를 바탕으로 도커 엔진은 컨테이너 (동적 - Instance)를 생성할 수 있는데 이 때 이미지와 함께 읽고 쓰기가 가능한 레이어를 추가해서 만들어진다.
2) Container는 Process
- 컨테이너는 이미지를 기반으로 만들어지는 snapshot
- 컴퓨터 프로그램이 실행중이면 프로세스라고 하는데 Container는 격리된 공간에서 동작하는 프로세스임
- docker run 명령어로 컨테이너가 만들어지고 동작하는데 이는 서버 호스트 운영체제가 독립적으로 동작하는 것과 유사하다
3) Image를 받아 Container를 생성 및 실행 과정
- gihyodocker/echo:latest 이미지 다운로드
- docker pull gihyodocker/echo:latest

- 컨테이너로 실행 - 하나의 애플리케이션 실행
- docker container run -t -p 9000:8000 gihyodocker/echo:latest
4) Container 수동 제어
- 컨테이너 생성
- docker crate -it --name contariner-test1 ubuntu

-
- docker ps

- 모든 컨테이너 확인
- docker ps -a
- 컨테이너 실행
- docker start container-test1

- 실행중인 컨테이너 확인
- docker ps

- 컨테이너 접속
- docker attach container-test1
- 셸에서 exit를 입력해서 빠져나오기

- 컨테이너 삭제
- docker rm container-test1
5) docker run 명령으로 한번에 수행하기
- docker run -it --name container-test1 ubuntu bash

6) Container의 생명 주기
- 실행 상태
- docker run 명령의 인자로 지정된 Docker Image를 기반으로 Container가 생성되면 Image를 생성했던 Dockerfile에 포함된 CMD 그리고 ENTRYPOINT 명렁에 정의된 애플리케이션이 실행되고 이 애플리케이션이 실행 중인 상태가 Container가 실행 중인 것
- 실행이 끝나면 정지상태가 됨
- docker run 명령의 인자로 지정된 Docker Image를 기반으로 Container가 생성되면 Image를 생성했던 Dockerfile에 포함된 CMD 그리고 ENTRYPOINT 명렁에 정의된 애플리케이션이 실행되고 이 애플리케이션이 실행 중인 상태가 Container가 실행 중인 것
- 정지 상태
- 실행 중인 Container를 명시적으로 정지하거나 Container에서 실행된 애플리케이션이 정상/오류 여부를 막론하고 종료된 경우에는 Container가 정지되지 않음
- Container가 정지되면 더 이상 동작하지 않지만 종료되던 시점의 상태가 저장되서 남아있기 때문에 다시 실행할 수 있음
- 파기 상태
- 정지 상태의 Container는 명시적으로 파기하지 않는 이상 디스크에 그대로 남아있음
- 컨테이너를 자주 생성하고 정지해야 하는 상황에서는 컨테이너가 점점 디스크 용량을 많이 차지할것이므로 사용하지 않는 Container는 삭제하는 것이 바람직함
7) docker run
- docker image pull, docker container create, docker container start + command 가 합쳐진 명령
- 이미지가 존재하면 바로 컨테이너를 생성하지만 이미지가 존재하지 않으면 다운로드 받아 컨테이너를 생성하는 명령
- 형식
- docker run [옵션] 이미지이름 (인자)
- 인자는 사용되는 이미지에 따라 달라진다.
- MySQL 같은 경우는 사용할 데이터베이스, 유저 아이디 및 패스워드, 인코딩 방식 등을 인자로 받을 수 있다.
- docker run [옵션] 이미지이름 (인자)
- 옵션
- --name 컨테이너 이름
- 컨테이너 이름을 설정하는 옵션으로 생략하면 자동으로 부여한다.
- -p [Host Port]:[Container Port]
- 컨테이너 내부 포트를 외부에 공개하여 접속할 수 있도록 해주는 port forwarding
- -P, --publish-all=[true|false]
- 컨테이너 내부의 노출된 포트를 외부의 임의 포트에 port forwarding
- -v, --volume=호스트경로:컨테이너경로
- 볼륨 마운트 - 호스트의 디렉토리를 컨테이너에 연결해서 데이터를 공유
- --net 네트워크이름
- 네트워크 (다른 컨테이너들에 연결할 때 사용하는 묶음)에 연결
- -i, --interface
- 대화식 모드로 연결
- -t
- 단말 디바이스 할당
- -d, --detach=true
- 백그라운드에서 컨테이너를 실행 한 후 컨테이너 아이디를 등록
- 계속해서 실행되고 있어야 하는 애플리케이션에 사용한다.
- -e, --env
- 환경 변수 설정
- --rm
- 컨테이너가 종료 될 때 컨테이너를 파기
- --restart (no | on-failure | on-failure:횟수 | always)
- 재시작 옵션
- -h 호스트 이름
- 호스트 이름을 설정하는 것으로 미지정시 컨테이너 ID가 이름으로 설정됨
- --link=[container:컨테이너아이디]
- 다른 컨테이너와 연결할 때 사용
- -d 는 컨테이너를 백그라운드로 실행하는 옵션이고 -t와 -i는 컨테이너 내부에 터미널로 접속하기 위해 사용하는 옵션
- -d 옵션 없이 컨테이너를 실행하게 되면 실행된 컨테이너가 프로그램의 실행을 마칠 때 까지 터미널의 제어를 차지하기 때문에 그 다음 명령을 입력할 수 없는 상태가 된다.
- -i 와 -t 옵션없이 컨테이너를 실행하면 컨테이너 안의 파일 시스템에 접근이 안되기 때문에 컨테이너 안의 설정을 변경해야 하는 경우 i 와 t 옵션을 가지고 실행해야 한다.
- --name 컨테이너 이름
- 한 번만 실행되고 종료되는 애플리케이션은 d 나 i 그리고 t 옵션 없이 실행
8) 현재 실행 중인 컨테이너 확인
- 형식
- docker ps [옵션]
- 옵션
- a : 모든 컨테이너를 출력
- 출력 항목
- CONTAINER ID : 컨테이너 식별자로 64글자 이지만 12글자만 출력
- IMAGE : 컨테이너를 만들 때 사용한 이미지 이름
- COMMAND : 컨테이너 실행 시 실행하도록 설정된 프로그램의 이름 또는 명령어
- CREATED : 컨테이너 생성 후 경과된 시간
- STATUS : 컨테이너의 현재 상태로 실행 중이면 Up 종료된 상태면 Exited
- PORTS : 포트 포워딩
- NAMES : 컨테이너 이름
9) 컨테이너 중지와 삭제
- 중지 : docker stop 컨테이너아이디 또는 이름
- 전체 중지 : docker stop &(docker ps -a - q)
- 삭제 : docker rm 컨테이너아이디 또는 이름
- 전체 삭제 : docker rm &(docker ps -a - q)
10) 실습
- Apache 이미지(httpd)를 컨테이너로 실행
- 컨테이너 생성 및 실행
- docker run --name apa000ex1 -d httpd
- 컨테이너 생성 및 실행

-
- 실행중인 컨테이너 확인
- docker ps
- 실행중인 컨테이너 확인

-
- 컨테이너 중지
- docker stop apa000ex1
- 컨테이너 삭제
- docker rm apa000ex1
- 모든 컨테이너 확인
- docekr ps -a
- 컨테이너 중지

- 포트 포워딩
- port forwarding
- 내부의 개방된 포트를 외부에서 접근할 수 있도록 HOST의 포트와 매핑시키는 것
- 포트 포워딩을 하게 되면 매핑된 외부 포트를 이용해 내부 포트로 접근이 가능하다.
- Apache는 80번 포트를 이용해 웹 사이트에 대한 접근을 기다렸다가 사용자가 이 포트를 통해 접근하면 요청을 확인하고 웹 사이트의 페이지를 제공한다.
- 포트 포워딩 하는 방법
- -p 호스트포트 : 컨테이너내부포트
- port forwarding
- Apache의 80번 포트를 외부에서 접근하도록 설정
- 컨테이너 생성 및 실행
- docker run --name apa000ex2 -p 8080:80 -d httpd
- 웹 브라우저에서 접속을 확인
- localhost:8080
- 컨테이너 생성 및 실행

2. 다양한 이미지
1) 리눅스 운영체제가 담긴 이미지
- debian
- ubuntu
- fedora
- centos
- busybox
- alpine
- busybox 기반으로 가볍고 간단한 보안성을 목적으로 한 리눅스 배포판으로 컨테이너에서 많이 이용함
2) web server
- httpd
- 하나의 웹 애플리케이션을 배포할 때 이용
- nginx
- 여러 개의 웹 애플리케이션을 하나로 접근해 사용할 수 있도록 할 때 이용
- Load Balancer의 역할로 사용할 수 있음
3) Database
- mysql
- -e 옵션을 이용해 MYSQL_ROOT_PASSWORD로 루트 패스워드를 지정해야 함
- mariadb
- -e 옵션을 이용해 MYSQL_ROOT_PASSWORD로 루트 패스워드를 지정해야 함
- postres
- -e 옵션을 이용해 POSTGRES_ROOT_PASSWORD로 루트 패스워드를 지정해야 함
- oracle
- 버전에 따라 설정하는 옵션이 다름
- mongodb
- redis
4) 프로그래밍 언어의 런타임
- 프로그래밍 언어로 만들어진 애플리케이션을 실행할 수 있도록 해주는 소프트웨어
- openjdk : Java
- python
- php
- ruby
- perl
- gcc : C 언어
- node
5) nginx를 컨테이너로 실행
- 80번 포트를 이용해 사용자의 요청을 받아들임
- 컨테이너 생성 및 실행
- docker run --name webserver1 -p 8001:80 -d nginx
- 브라우저에서 확인
- http://localhost:8001
- 컨테이너 생성 및 실행

-
- 리소스 사용량 확인
- docker stats webserver1
- 실행 중인 프로세스 확인
- docker top webserver1
- 컨테이너의 접근 로그를 도커 명령으로 확인
- docker logs -f webserver1
- 리소스 사용량 확인
6) 실행 중인 컨테이너를 제외하고 모든 컨테이너를 제거
- docker container prune
7) 사용하지 않는 Imag, Container, Volume, Network 등 모든 Docker 리소스를 삭제
- docker system prune
'DX Data School' 카테고리의 다른 글
Deployment (1) | 2024.04.09 |
---|---|
쿠버네티스 (Kubernetes) (0) | 2024.04.08 |
Docker (0) | 2024.04.05 |
Container 와 Virtualization (0) | 2024.04.05 |
CI/CD (0) | 2024.04.05 |