Docker 컨테이너란?
Docker는 컨테이너형 가상화 기술 중에 하나이다(VM과 유사). 컨테이너란 호스트 OS상에 논리적인 구획을 만들고, 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것이다.
호스트 OS의 리소스를 논리적으로 분리시키고, 여러 개의 컨테이너(ISO 사용 / OS 없음)가 공유하여 사용하며 컨테이너는 오버헤드가 적기 때문에 가볍고 고속으로 작동한다.
Doker는 애플리케이션의 실행에 필요한 환경을 하나의 이미지(AMI)로 모아두고(=>컨테이너), 그 이미지를 사용하여 다양한 환경에서 애플리케이션 실행 환경을 구축 및 운용하기 위한 오픈소스 플랫폼이다. Docker 내부에서 컨테이너형 가상화 기술을 사용하고 있다.
(Docker CE; Community Edition 무료 오픈 소스, EE; Enterprise Edition 유료, 보안 관련 취약점 점검 서비스 제공)
윈도우 설치 비추천
Docker의 세가지 기능
- Docker 이미지를 만드는 기능: docker image build
- Docker 이미지를 공유하는 기능: docker image push/pull
- Docker 컨테이너를 작동시키는 기능: docker container run

Docker의 기본 개념
Docker는 컨테이너형 가상화 기술(운영 체제 수준 가상화)을 사용한다. 컨테이너형 가상화 자체는 Docker 이전에도 LXC(Linux Containers)가 있었으며 Docker 초기에는 컨테이너형 가상화를 구현하는 데 LXC를 런타임으로 사용했다.
가상화 기술과 컨테이너 기술 비교

가상 머신(VM)은 하드웨어 기반의 여러 게스트 운영 체제로, 하이퍼바이저를 통해 에뮬레이션된다. 컨테이너는 애플리케이션 수준 구성이며 커널 하나를 공유하는 여러 가상 환경을 에뮬레이션한다.
Docker 이미지
Docker 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로, 컨테이너를 생성하는 템플릿 역할을 한다.
Docker 컨테이너
Docker 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션이 구체화되어 실행되는 상태이다.

Docker 네트워크 구조


# 컨테이너에 접속
docker exec -it webserver bash
# 업데이트
apt update
# ip a 명령어가 안먹으므로 설치
apt-get install -y iproute2
# 아이피 확인
ip a

veth516ec3b@if8 와 eth0@if9 는 서로 연결되어있다. (interface 8, 9)
그리고 도커는 DHCP기능도 가지고 있음을 알 수 있다.
Docker - centos
VBox 세팅

센토스 도커 설치
# CentOS7 도커 설치
curl -fsSL https://get.docker.com/ | sh # sh: bash shell
yum -y install bash-completion wget unzip mysql
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
systemctl enable --now docker
참고로, 'enable --now' 명령어는 설치하고 처음 딱 한번만 사용하는 것이다. (운영 중에는 X)
도커 기본 명령어
# 도커에 있는 이미지 검색
docker search [이미지 이름]
# 이미지 다운로드
docker image pull [이미지 이름]
# 다운로드한 이미지 목록 확인 ( '-q'를 통해 아이디만 출력 가능)
docker image ls
# 이미지의 세부 정보 중에서 OS 확인 (inspect: 세부 정보 출력, 'format'을 변경하여 항목 변경 가능)
docker image inspect --format="{{ .Os}}" [이미지 이름]




# 컨테이너 생성. (왼쪽: 도커 호스트 포트 / 오른쪽: 컨테이너 포트 (80 -> 80으로 포트 포워딩))
# 실행 중인 서버의 포트 번호와 이름이 중복되면 충돌이 나서 에러가 뜬다
# 아래의 'run' 명령어 때문에 잘 안쓰인다.
docker container create -p 80:80 --name webserver nginx
# 컨테이너 시작
docker container start webserver
# 컨테이너 정지
docker container stop webserver
# 컨테이너 삭제
docker container rm -f webserver1





# 컨테이너 생성 + 실행
docker container run -p 80:80 --name webserver nginx
# (d: detach 백그라운드 실행)
docker container run -d -p 88:80 --name webserver1 nginx
# --name 옵션을 제외하면 이름이 자동으로 정해진다.
# '-P'를 넣고 포트 번호를 따로 적지 않아도 포트 번호가 자동으로 정해진다.






# 컨테이너를 임시로 캘린더만 출력하고 종료
docker container run --name test_cal centos /bin/cal


# 컨테이너가 만들어지고 컨테이너 안쪽에서 입력이 가능(-i:표준입력, -t:터미널 , bash:명령어를 의미)
docker container run -it --name test_bash centos /bin/bash
# 다음과 같은 방법으로 바로 mysql에 접속 가능하다.
docker container run -it --name test_mysql mysql /bin/bash -h [db 아이피] -u wpuser -p
# (--rm: 잠시 사용하고 삭제)
docker container run --rm -it --name test_mysql mysql /bin/bash -h [db 아이피] -u wpuser -p
# 백그라운드 실행으로 핑 테스트를 하면 결과가 출력되진 않는다.
docker container run -d --name test_ping centos /bin/ping localhost
# 하지만, 다음 명령어를 통해 백그라운드에서 이루어진 핑 테스트의 결과를 볼 수 있따.
docker container logs -t test_ping


# 컨테이너 생성
docker container run -d -p 8080:80 --name test_port nginx
# 컨테이너의 상태 확인
docker container stats test_port
# 컨테이너의 자원을 수정하여 'run' 가능
docker container run -d -p 8181:80 --cpus 1 --memory=256m --name test_resource nginx
# 호스트의 '/tmp' 폴더와 컨테이너의 '/usr/share/nginx/html'을 연결
docker container run -d -p 8282:80 --cpus 1 --memory=256m -v /tmp:/usr/share/nginx/html --name volume-container nginx





# (f: filter 해당 조건에 맞는 컨테이너만 출력)
docker container ls -a -f exited=0
# '--format'을 통해 원하는 형식으로 출력
docker container ls -a --format "table {{.Names}}\t{{.Status}}"


# 컨테이너 접속(attach)
docker container attach test_bash7
# 'ctrl + p, ctrl +q'를 눌러서 컨테이너를 멈추지 않고 탈출

# 'run'은 컨테이너를 생성하며 실행이지만,
# 'exec'은 실행 중인 컨테이너에 인자를 집어넣으면서 실행 (백그라운드와 달리 출력이 보임)
docker container exec -it test_port /bin/echo "Hello world"
# 이런 식으로 터미널 사용 가능
docker container exec -it test_port /bin/bash
docker container exec -it test_port /bin/sh # bash가 안될 경우 사용(bash보단 조금 떨어짐)



# 컨테이너의 프로세스 정보 확인 가능(top)
docker container top test_port
# 컨테이너의 포트 정보 확인 가능 (port)
docker container port test_port

# 컨테이너 이름 변경 (포트 번호는 변경 불가)
docker container rename test_port webserver2

# 컨테이너의 파일을 호스트로 복사
docker container cp webserver:/usr/share/nginx/html/index.html /root/index.html
# 호스트의 파일을 컨테이너로 복사
docker container cp ./index.html webserver:/usr/share/nginx/html/index.html



# commit: 이미지를 만드는 명령어 ('-a': author, '-m': 메시지)
docker container commit -a "kyounggu<test@example.com>" -m "Congratulations v1.0" volume-container test_commit:v1.0
# 이미지 정보 확인
docker image inspect test_commit:v1.0
# 이미지를 이용하여 컨테이너 생성
docker container run -d -p 80:80 --name test_commit_web test_commit:v1.0



# 위의 명령어 중에서 줄여서 사용 가능한 경우
# 컨테이너 시작 (전과 달리 명령어를 줄여서 사용)
docker start test_commit_web
# 현재 실행중인 컨테이너
docker ps
# image ls의 줄임
docker images
# 컨테이너 삭제 (container 생략 가능)
docker rm -f test_commit_web
# 이미지 삭제 (rmi: 이미지 삭제)
docker rmi -f centos:latest
# 이미지로 컨테이너 시작
docker run -d -p 80:80 --name webserver test_commit_web:v1.0
# 이미지를 tar파일로 저장
docker save -o test_commit.tar test_commit_web:v1.0
# tar파일에서 이미지 불러오기
docker load -i test_commit.tar




# 도커의 네트워크 확인
docker network ls
# 네트워크 세주 정보 확인 (network 생략 가능)
docker network inspect [네트워크 아이디]
# 네트워크 브릿지 생성
docker network create -d bridge --subnet 10.51.0.0/16 --ip-range 10.51.0.0/24 test_bridge
# 네트워크 연결
docker network connect bridge webserver
# 네트워크 연결 끊기
docker network disconnect bridge webserver
# 생성한 네트워크를 이용하여 컨테이너 생성
docker container run -d -p 8080:80 --name webserver1 --network test_bridge test_commit_web:v1.0
# 현재 사용하지 않는 컨테이너를 삭제할 때 prune 사용
docker container prune
# 네트워크 삭제
docker network rm test_bridge




Docker - ubuntu
ubuntu 환경 세팅


우분투 도커 설치
# Ubuntu 도커 설치
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
##sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable" # 우분투 18.04
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable" # 우분투 16.04
sudo apt update
sudo apt-cache policy docker-ce
sudo apt install docker-ce -y
# 해당 사용자는 sudo를 쓰지 않아도 되게 해준다. (exit로 세션 재접속 필요)
sudo usermod -a -G docker kyounggu
도커 명령어
# docker(centos)에서 tester(ubuntu)로 tar파일 전송
scp test_commit.tar kyounggu@192.168.1.204:/home/kyounggu
# tar파일에서 이미지 불러오기
docker load -i test_commit.tar
# 이미지로 컨테이너 생성
docker run -d -p 80:80 --name webserver test_commit_web:v1.0


워드프레스
dbserver 생성 및 실행
# dbserver 생성 및 실행 (e: 환경변수)
docker run -d -p 3306:3306 --name dbserver \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
-e MYSQL_ROOT_PASSWORD=password --network test_bridge mariadb
webserver 생성 및 실행
# 컨테이너 생성 ( centos7은 포트 정보가 없으므로 -itd를 통해 생성)
# dbserver와 동일한 네트워크로 해줘야 서로 통신이 된다.
docker run -itd -p 8888:80 --name apache --network test_bridge centos:7
# 생성한 컨테이너에 들어가서 설치 (현재 텅 비어있는 상태이므로)
docker exec -it apache bash
yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
cd /var/www/html
unzip /wordpress-4.8.2-ko_KR.zip
mv wordpress/* ./
chown -R apache:apache /var/www
httpd & # systemctl enable --now httpd

'메가존 클라우드 2기 교육 > 실무 특화' 카테고리의 다른 글
Docker - 도커 데이터 관리, onbuild 명령어 활용, 도커 사설 레지스트리, 도커 컴포즈, 도커 모니터링, 도커 스웜 (3) | 2023.05.26 |
---|---|
Docker - Dockerfile, 도커 허브, GCP에서 사용 (0) | 2023.05.25 |
Ansible - CLI, 플레이북 (1) | 2023.05.22 |
Terraform - GCP에서의 사용 (0) | 2023.05.19 |
Terraform - 모듈식 생성, ALB와 ASG, NAT + RDS 생성 (0) | 2023.05.17 |