본문 바로가기
  • 지요미의 IT성장일기
Docker

Docker 2

by 지요미=P 2024. 1. 29.
728x90

 

컨테이너 여러개를 한꺼번에 실행시키기

 

수백개의 컨테이너가 있다는 가정하에

많은 컨테이너를 한꺼번에 실행하는 방법

docker start $(docker ps -a -q)

변수를 사용함.

 

 

[test_cal] 컨테이너는 임시 컨테이너인데,

컨테이너 역할만 잠시 한 후, 지우고 싶다?

docker run --rm --name test_cal_rm centos /bin/cal
docker ps -a -f name=test_cal_rm

 

 

이미지 내보내기

[save]명령어를 통해서

test_commit   v2.0 + test_commit   food 이 두개의 파일을 tar파일로 묶기

(이미지 명령어는 save 명령어 통해 생략 가능)

 

docker save -o test_commit_food.tar test_commit:food
docker save -o test_commit_v2.tar test_commit:v2.0

폴더 안에 tar파일이 생성된 것을 볼 수 있다!! 신기행

 

 

 

 

테스트를 위해서 우분투에 test_commit_food.tar파일을 넣어줌!

 

sudo docker load -i test_commit_food.tar

[load] 명령어를 사용해서 가져오기!

자세히 보면 Image ID도 동일함!!

그대로 가져오기가 한거쥐~

 

docker run -d -p 8081:80 --name test_commit_food test_commit:food

도커 호스트 ip로 접근!

 

 

 

 

두번째 tar파일인 test_commit_v2도 이미지를 복사해서 내보내보기!

scp test_commit_v2.tar jyoonchu@172.25.0.139:/home/jyoonchu/

 

 

sudo docker load -i test_commit_v2.tar

layer가 작은 이유는 앞서 test_commit_food.tar 파일과 겹치는 부분은 다운이 안되기 때문!

용량 차지에 아주 효율적~

 

 

실행시켜보자

sudo docker run -d -p 8082:80 --name test_commit_v2 1d98717e6845

 

홈페이지 실행!

 

 

 

 

 

docker exec -it test_commit_food bash
ip a

apt updat
apt install -y iproute2
apt install -y iputils-ping

 

 

로그아웃을 하면 도커가 자동으로 꺼지는데,

내가 다시 로그인을 하면 한꺼번에 켜질 수 있도록 해보쟈

 

도커 꺼지지 않고 자동 실행이 시키기!

sudo docker update --restart=always test_commit_food

 

 

 

Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap

????

sudo vi /etc/default/grub
sudo rebbot
sudo update-grub

 

https://eyeballs.tistory.com/29

 

sudo docker update --restart always --cpu-shares 256 --memory 256m --memory-swap 512m test_commit_food

 

 

docker network ls
docker inspect bridge

 

 

 

Docker 네트워크 생성 및 삭제

(docker network create/rm)

옵션 설명
--driver, -d 네트워크 브릿지 또는 오버레이
--ip-range 컨테이너에 할당하는 IP주소의 범위 지정
--subnet 서브넷을 CIDR 형식으로 지정

 

기본 구문 : # docker network create [옵션] 네트워크

예시
# docker network create -d bridge --subnet 192.168.123.0/24 --ip-range 192.168.123.0/24 test_bridge
# docker network rm test_bridge

 

-d : driver

--ip-range : DHCP

 

docker network create -d bridge --subnet 10.246.0.0/16 --ip-range 10.246.0.0/20 test_bridge
docker network ls
docker inspect test_bridge

 

 

Docker 네트워크 연결

기본 구문 : # docker network connect [옵션] 네트워크 컨테이너

docker inspect webserver2
docker network connect test_bridge webserver2
docker inspect webserver2

'webserver2'의 ip대역을 변경해보고자 한다.

 

-> Networks와 tdst_bridge 두개의 IP가 보여진당

 

docker network disconnect test_bridge webserver2
docker inspect webserver2

disconnet로 네트워크를 끊음!

 

docker exec -it webserver bash
apt update && apt install -y iproute2 iputils-ping

 

docker network connect test_bridge webserver
docker network connect test_bridge webserver2

hostname
ping bd63e5c9946d

네트워크를 브릿지와 연결하였더니 hostname으로도 핑이 간다.

 

ip대역이 bridge와 test_bridge 두개가 보여져서 연결을 끊고 싶다면.

이렇게 disconnect로 끊을 수 있다.

 

disconnect가 되었다고 하더라도

컨테이너 이름으로 핑이 간다.

(같은 네트워크 안에 있다는 가정 하에 말이다.)

 

 

이제부터는 네트워크를 꾸민다 하면은.

 

도커 용량 확인

docker system df
docker system info

 

 

컨테이너 정리

docker container prune

stop되어 있는 자원들 정리해줌!!

 

active되어 있는 컨테이너만 살아있음!!

 

 

 

이미지 정리

docker image prune

컨테이너는 쉽게 지울 수 있는데 이미지는 지우기가 까다로우니 참고~~

 

이미지 삭제하기

docker images
docker rmi -f f0b8a9a54136

 

 

컨테이너 삭제하기

docker ps
docker rm -f stoic_jang

 

 

컨테이너 모두 삭제하기

docker ps
docker rm -f $(docker ps -a -q)

 

 

docker images
docker run -d -p 8081:80 --name web01 --network test_bridge test_commit:v2.0
docker inspect web01

 

inspect로 보았을 때 IP주소도 bridge로 되어있음을 확인함!!

 

 

 

 

--- 워드프레스
- dbserver
# docker run -d -p 3306:3306 --name dbserver \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=Test1752! \
-e MYSQL_ROOT_PASSWORD=Test1752! \
--network test_bridge mariadb

- webserver
# docker run -d -p 80:80 --name webserver \
-e WORDPRESS_DB_HOST=dbserver \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=Test1752! \
--network test_bridge wordpress:4.8.2

https://hub.docker.com/_/mariadb

 

참고 : https://mariadb.com/kb/en/mariadb-server-docker-official-image-environment-variables/

컨테이너 및 이미지가 한꺼번에 깔린다.

 

https://hub.docker.com/_/wordpress

 

 

 

 

 

cd /var/lib/docker/volumes/7cc1568c12dc6418c4b79ca9128beb36645b02bc3c26b382ee5cd27fd80315ed/_data
ls
cd
docker rm -f dbserver
docker run -d -p 3306:3306 --name dbserver -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=Test1752! -e MYSQL_ROOT_PASSWORD=Test1752! --network test_bridge mariadb

자동으로 볼륨이 형성되어 마운트가 되어 있다.

docker run -d -p 3306:3306 --name dbserver -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e 12dc6418c4b79ca9128beb36645b02bc3c26b382ee5cd27fd80315ed:/var/lib/mysql mariadb
docker ps

홈페이지와 댓글까지 그대로 있음!!!

 

 

 

docker rm -f dbserver webserver
docker run -d -p 3306:3306 --name dbserver -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wpuser -e MYSQL_PASSWORD=Test1752! -e MYSQL_ROOT_PASSWORD=Test1752! --network test_bridge -v 7cc1568c12dc6418c4b79ca9128beb36645b02bc3c26b382ee5cd27fd80315ed:/var/lib/mysql mariadb
docker run -d -p 80:80 --name webserver -e WORDPRESS_DB_HOST=dbserver -e WORDPRESS_DB_NAME=wordpress -e WORDPRESS_DB_USER=wpuser -e WORDPRESS_DB_PASSWORD=Test1752! --network test_bridge -v wpweb-vol:/var/www/html wordpress:4.8.2

만들었던 서버를 삭제하고 다시 띄어보기~!

 

 

 

Dockerfile이란?

앞서 다루어 본 Docker 이미지 생성 방법은 베이스 이미지(nginx)를 바탕으로 일일이 컨테이너를 생성하고, 파라미터(html)를 설정하며, 미들웨어 설치를 통해 만들어진 컨테이너를 Docker 이미지로 생성하였다.

반면에 Docker 파일은 컨테이너를 생성하는 여러 구성 정보를 하나의 파일로 정리하고 일괄 실행하여 docker build 명령을 통해 Docker 이미지를 작성하는 스크립트!

 

 

Dockerfile을 구성하는 명령어

COMMAND 설명 COMMAND 설명
FROM 베이스 이미지 지정 ADD 파일 추가 (tar 풀 수 있음)
MAINTAINER 작성자 지정 COPY 파일 복사
RUN 명령어 실행 VOLUME 볼륨 마운트
CMD 데몬 실행 ENTRYPOINT 데몬 실행
LABEL 라벨 설정 USER 사용자 설정
EXPOSE 포트 내보내기 WORKDIR 작업 디렉토리 지정
ENV 환경 변수 설정 ONBULD 빌드 후 실행 명령
# mkdir test
# cd test/
# vi Dockerfile

FROM ubuntu:18.04
MAINTAINER jyoonchu<test@example.com>
LABEL "name"="webserver"
ENV aloha=date
ENV path=/var/www/html
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install apache2 -y
COPY nihao /var/www/html/nihao
COPY hello.html $path
ADD test.tar $path
WORKDIR $path
RUN echo "<h1>ohayo</h1>" > ohayo.html
VOLUME $path
EXPOSE 80
ENTRYPOINT ["apachectl"]
CMD ["-D", "FOREGROUND"]

대소문자를 꼭 구분해야 한다.

 

ENV aloha=date

aloha라는 명령어를 입력하면 'date'가 실행되는 환경변수

 

ENV path=/var/www/html

홈페이지가 담긴 경로를 'path'라는 변수에 경로를 넣어준 환경변수


RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list

sed 취합명령을 통해 ftp.daumkakao.com의 미러사이트로 치환하여 repo를 지정하고 repo를 진행

 

RUN apt-get update

repo가 바뀌면 꼭 update를 시켜주어야 한다.


RUN apt-get install apache2 -y

apache2 설치해주기(feat.y 꼭!!)


COPY nihao /var/www/html/nihao

docker host 어딘가에 있을 어떤 문서들(예.html)을 도커 이미지를 만드는 와중에 해당 폴더에 통으로 복사해서 넣는 작업


COPY hello.html $path

이미 위에 선언한 /var/www/html에 파일을 복사해서 넣는 작업


ADD test.tar $path

[ADD는 파일을 추가하고, tar파일의 압축도 푸는 기능을 갖추고 있다.]

webserver이미지를 꾸미고 front 홈페이지의 장식


WORKDIR $path

경로를 변경하는 작업

(cd 역할을 한다고 생각하면 좋다)


RUN echo "<h1>ohayo</h1>" > ohayo.html

경로는 위에서 바꼈을 것이다 (var.www.html)

그 경로에 ohayo.html 파일을 만드는 작업


VOLUME $path

위에 지정한 환경변수를 볼륨으로 지정하겠다는 의미


EXPOSE 80

80포트를 내보내는 작업

예를 들어, 32768:80에서 80이 expose라고 생각하면 된다.

-P 이 부분은 꼭 헷갈리면 안된다.


ENTRYPOINT ["apachectl"]

[entrypoint]는 [CMD]보다 강제적이다.

"apachectl"명령어를 통해 컨테이너를 만들어서 apache2가 실행되고 webserver가 실행이 되어야만 하는 명령어

보통은 ENTRYPOINT 명령어를 많이 사용함


CMD ["-D", "FOREGROUND"]

내가 이 이미지를 만들어서 누군가가 내려받을거고.

그 때 이 이미지를 활용할 것인지 안할 것인지 유저 선택에 맡기는 명령어

(사용자의 선택의 여지를 주는 명령어가 바로 "CMD"가 되는 것이다.)

 

ENTRYPOINT ["apachectl", "-D", "FOREGROUND" ]

이렇게 두개의 명령어를 한꺼번에 사용하기도 한다.

 

mkdir nihao
echo "<h1>nihao-jyoonchu</h1>" > nihao/index.html
echo "<h1>hello-jyoonchu</h1>" > hello.html

 

docker build -t sesac:sale .

 

rm -rf test.tar
ls
cp ~/food.tar .
ls
mv food.tar test.tar
docker build -t sesac:food .

 

 

이미지를 컨테이너로 만들어보자요

 

docker run -d -P sesac:sale
docker run -d -P sesac:food

 

 

테스트 화면

 

모두 완벽(?)하게 화면이 생성되었다.

 

 

컨테이너에 진입을 해서 변수를 확인해보장

 

docker exec -it sleepy_jemison bash
$aloha
echo $aloha
echo $path

 

 

docker inspect sesac:sale | grep jyoonchu
docker inspect sesac:sale | grep webserver
docker inspect sesac:sale

마운트 > 소스 = 실제 host 경로

 

cd /var/lib/docker/volumes/22182a2d3724a7aba63ceef75d63fac92dc10746f12a19292d11c7a0a80134ac/_data
ls

 

호스트 경로를 통해서 들어가보니 안에 내가 만든(?) 파일들이 모두 있는 것을 확인할 수 있었다.

이 뜻은!!

마운트 > 소스는 결국 실제 host의 경로라는 것이쥐~~

 

점점 어려워지지만..

할 수 있........더보기

 

728x90

'Docker' 카테고리의 다른 글

멀티 컨테이너 구현1  (1) 2024.01.31
Docker 3  (1) 2024.01.30
Docker 명령어 + 우분투에 도커 설치하기  (3) 2024.01.26
Docker 1  (1) 2024.01.25
Docker란 무엇인지.. 필기  (0) 2024.01.25