# 컨테이너 이미지로 만든 후 tar 파일로 만들기
docker container commit -a "johnlee<test@example.com>" -m "NICE TO MEET YOU" webserver test_commit:v1.0 # container을 이미지로 만드는 과정
docker image ls
docker image inspect test_commit:v1.0 # image 세부정보 확인
docker image save -o test_commit.tar test_commit:v1.0 # 이미지를 tar로 만드는 과정
ls -al # tar파일이 만들어져 있음
docker rm -f webserver # container 삭제
docker rmi -f test_commit # 이미지 삭제
docker image load -i test_commit.tar # test.tar 파일 이미지로 옮기기
docker images # 이미지 확인( = docker image ls)
docker run -d -p 80:80 --name webserver test_commit:v1.0 # 다시 webserver 컨테이너 실행
# 우분투 docker 설치
$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ 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 # ce 커뮤니티 에디션
$ sudo usermod -a -G docker yunhyeong # 사용자 그룹에 yunhyeong 아이디를 넣어줌으로써 sudo를 사용안해도 된다.
# scp test_commit.tar yunhyeong@192.168.1.187:/home/yunhyeong # centos에서 test_commit.tar 파일 전송
$ docker load -i test_commit.tar # centos에서 보낸 test_commit.tar파일 컨테이너로 올리기
$ docker run -d -p 80:80 --name webserver test_commit:v1.0 # 컨테이너 run, 우분투 ip로 브라우저에서 접근
$ docker ps # 컨테이너 확인
# Docker 네트워크 구조


ip a # public 네트워크 확인; 33: vethaf1d3c0@if32 # 도커 호스트
docker exec -it webserver bash # 컨테이너 내부로 진입
### 컨테이너의 os 확인
yum
apt
###
cat /etc/os-release # os의 이미지 계층을 확인할 수 있다
apt update
apt install -y iproute2 # iproute2를 설치함으로써 컨테이너의 ip를 확인할 수 있음
ip a # 컨테이너 안에서 아이피를 확인하면 32: eth0@if33 확인 가능
- 도커 호스트를 외부 네트워크, 컨테이너의 호스트를 내부 네트워크로 볼 수 있음
# 도커 네트워크 확인

docker network ls # bridge 확인
docker inspect <bridge ID>
- 브릿지에 연결된 컨테이너들을 확인할 수 있다.
# bridge로 네트워크 만들기
docker network create -d bridge --subnet 10.57.0.0/24 --ip-range 10.57.0.0/24 test_bridge
docker network rm test_bridge # 네트워크 대역대 설정
docker inspect test_bridge
docker inspect webserver # 컨테이너 세부 정보 확인
docker network connect test_bridge webserver # webserver 컨테이너가 test_bridge에 연결됨
docker container inspect webserver
docker network disconnect test_bridge webserver # test_bridge와 webserver 분리, 재연결시 컨테이너의 ip주소가 변한다.
docker run -d --name webserver1 --network test_bridge -p 8080:80 test_commit:v1.0 # 이미지를 활용하여 webserver1의 컨테이너를 만든 후, 위에서 생성한 브릿지에 연결
docker network inspect test_bridge
apt install -y iproute2 # 컨테이너의 ip를 확인할 수 있음
# docker container prune # 현재 사용하지 않는 컨테이너를 지우고자 할때 사용
# database 설치
# 변수명은 도커에서 미리 정의해 놓음
- dbserver
# 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 구성
# docker run -d -p 8888:80 --name apache --network test_bridge centos:7 # centos:7은 일반 os가 아니라 centos에서 실행파일들을 모아 놓은 규모가 작은 이미지, 하지만 포트를 열면 웹 서버로서 centos:7 이미지를 인식하지 못하기 때문에 컨테이너가 중단됨
# docker run -itd -p 8888:80 --name apache --network test_bridge centos:7 # 컨테이너를 VM처럼 조작할 수 있게 된다.
# 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 &
# 도커 파일 만들기
* 도커 파일을 구성하는 명령어

* 도커 파일이 위치할 디렉토리 구성

* vi Dockerfile(거의 모든 변수를 활용하여)
FROM ubuntu:18.04
MAINTAINER johnlee
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 # sed는 치환 명령어
RUN apt-get update
RUN apt-get install apache2 -y
COPY nihao /var/www/html/nihao
COPY hello.html $path
ADD aws.tar /var/www/html # add는 tar를 풀 수 있는 기능이 있다.
WORKDIR /var/www/html # cd /var/www/html
RUN echo ohayo >> ohayo.html
VOLUME /var/www/html
EXPOSE 80
ENTRYPOINT ["apachectl"] # ["apachectl", "-D", "FOREGROUND"] # 이미지를 실행할때 옵션을 수정할 수 없음
CMD ["-D", "FOREGROUND"] # ["apachectl", "-D", "FOREGROUND"] # 이미지를 실행하고 나서도 수정이 가능함
- docker build -t hello:v1.0 .
- 최종적으로 빌드하여 hello:v1.0 이미지를 만든다.
- "docker inspect hello:v1.0"를 활용하여 이미지 세부 정보 확인
- "docker run -d -P hello:v1.0"로 컨테이너 만들기( -P: 포트번호를 임의로 부여, -p 8888:80: 포트번호 8888)
- "docker exec -it <컨테이너 ID> bash"로 컨테이너 접근
# 파일을 tar로 만든 후 도커 파일 생성 (simple)

- /tmp 경로에 미리 만들어 놓은 images 폴더와 index.html 파일을 활용한다
tar cvf test.tar images index.html
mkdir test && cd $_
vi Dockerfile
FROM nginx:latest
ADD test.tar /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
- docker build -t test_build:v1.0 .으로 이미지를 구운다
- docker run -d -P test_build:v1.0 으로 컨테이너 실행
- docker ps 로 새롭게 만든 컨테이너의 포트를 확이한고 브라우저에서 접근
- index.html 파일이 변경될 경우 mkdir의 경로를 다르게하여 Docker 파일을 만든 후 test_build의 버전을 업그레이드(test_build:v2.0)하여 이미지를 만든다.
# Docker hub

- docker hub의 아이디 만들기

- test_build:v1.0의 tag를 만든다.; 복사가 아니라 test_build에 새로운 이름을 붙여서 생성한것; Image ID가 같다

- docker login

- 이미지를 Docker 허브에 푸시

- repositories에서 확인


- test_build:v2.0을 tag로 만들고 push
- login 후에 사용을 하지 않으면 logout을 해야한다.

- 이미지의 버전을 확인한다.

- 우분투 환경에서도 docker 허브의 레퍼지토리에 있는 이미지를 활용하여 컨테이너 생성
- 껐다 켜졌을때 도커가 다시 올라올 수 있도록 restart 옵션설정

- 이미지 빌드시 docker hub의 레퍼지토리를 지정해주면 tag 과정을 거치지 않아도 된다.
# wordpress Dockerfile
# mkdir wordpress && cd $_ # root 경로에서 실행
# vi Dockerfile
FROM centos:7
MAINTAINER itssp0405@gmail.com
RUN yum install -y httpd php php-mysql php-gd php-mbstring wget unzip
RUN wget https://ko.wordpress.org/wordpress-4.8.2-ko_KR.zip
WORKDIR /var/www/html
RUN unzip /wordpress-4.8.2-ko_KR.zip
RUN mv wordpress/* .
RUN chown -R apache:apache /var/www
EXPOSE 80
CMD httpd -DFOREGROUND
* 도커 허브에 올리기
docker build -t hyeongyun/my-wp:v1.0 .
# docker push hyeongyun/my-wp:v1.0
# docker run -d -p 80:80 --name wordpress --network test_bridge hyeongyun/my-wp:v1.0
# push전 test
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
docker run -d -P --name my-wp --network test_bridge hyeongyun/my-wp:v1.0
- wordpress DB를 만든 후 테스트
- --network test_bridge안에 네트워크 정보가 담겨 있음(IP대역대를 주지 않아도 자동으로 생성된다)
- test 후 wordpress에 잘 접근 된다면 run 실행
# 클라우드 환경(VM; GCP, route53:AWS)

curl -fsSL https://get.docker.com/ | sh # 해당 주소에 도커 설치를 위한 배시 스크립트들이 담겨있다.
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
- gcp VM에서 도커 설치

- docker network를 생성하고 IP 대역대 확인
# 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_network mariadb
- Database 설치

- docker hub에 올려놓은 이미지를 활용하여 wordrpess 컨테이너 생성
- 반드시 네트워크와 연결한다(gcp-network)

- route53에서 GCP ip로 A 레코드 생성

- 레코드에 나와있는 주소를 활용하여 wordpress 접근

- dbserver, wordpress 컨테이너를 commit후 docker hub에 올린다.
- commit : 운용중인 컨테이너를 이미지로 생성
- build : 도커파일을 찾아서 이미지로 생성
# 도커 데이터 관리
* Bind Mount(폴더공유)
[root@localhost ~]# mkdir volume && cd $_
# mkdir bm01 ; touch bm01/test.txt
# docker run -itd --name bm-test -v /root/volume/bm01:/mnt centos:7
# docker exec bm-test ls /mnt
* Volume(볼륨 생성해서 마운트)
inspect, list 등의 명령어 사용하여 관리 할 수 있음 .
# docker volume create my-vol01
# docker volume list
# docker volume inspect my-vol01
"Mountpoint": "/var/lib/docker/volumes/my-vol01/_data"
# docker container run -itd --name vol-test -v my-vol01:/mnt centos:7
# docker container run -itd -p 801:80 --name vol-web -v my-vol01:/usr/local/apache2/htdocs:ro httpd:latest
## --- httpd라는 이미지를 이용하여 컨테이너를 만들면 마운트 포인트 경로에 index.html이 생긴다.
# curl 192.168.1.148:801
<html><body><h1>It works!</h1></body></html>
# docker container exec vol-test sh -c "echo "Nihao" > /mnt/index.html"
# curl 192.168.0.151:801
Nihao
- vol-test와 vol-web 사이에 공동으로 사용할 수 있는 my-vol1이 생겨서 한쪽 컨테이너에서 my-vol1을 수정하면 다른쪽에서도 공유된다.( NFS, AWS-EFS이랑 비슷한 느낌)
# onbuild 명령어 활용
운영자로서 개발자에게 도움을 주기 위해 사용
* 운영자 역할
# mkdir onbuild && cd $_
# vi Dockerfile.base
FROM ubuntu:18.04
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt-get -y update
RUN apt-get -y install nginx
EXPOSE 80
ONBUILD ADD website*.tar /var/www/html/
CMD ["nginx", "-g", "daemon off;"]
# docker build -t hyeongyun/web-base:v1.0 -f Dockerfile.base . # 도커 파일이 이미지로 만들어짐
# docker login
# docker push hyeongyun/web-base:v1.0
# vi Dockerfile
FROM hyeongyun/web-base:v1.0 # Onbuild하는 명령어
* 개발자 역할
# mkdir onbuild && cd $_
# ls
website.tar
Dockerfile
# docker build -t hyeongyun/web-site:v1.0 .
# docker run -d -p 80:80 --name=web-site hyeongyun/web-site:v2.0
# docker login
# docker push hyeongyun/web-site:v1.0
'Cloud Solution Architect > 컨테이너' 카테고리의 다른 글
도커(Docker) (0) | 2023.05.25 |
---|