-cmd 명령어
<aside> 💡 Why? Container를 사용하는가
ex 신발가게 > 가게가 불타면 장사x | 신발이 타면 장사 가능 가게를 여는거 | = 서버를 여는
서버 운영자 → 데이터 백업
서버가 터지면 → 서버열고 데이터 백업된걸 입력
처음부터 서버 3개~4개 운영 (같은 공간 — 클러스터링) Scale in/out이 쉬워서 컨테이너 사용
안정성 (쿠버네틱스 >> 문제 발생할 거같다 하면 예비 container로 “자동”으로 바꿈 / 업데이트 할 때 contaioner1 (업뎃중) container2(서버대체)로 대체품으로 사용 가능)
Scale in/out 쉬움
배포가 쉬움 (※ 데이터는 container 안에 두지 않는다)
</aside>
<aside> 💡 Docker란?
리눅스 기반
VM에 비해 성능손실이 거의 없고 이식성이 좋고 이미지를 중앙에 저장하여 편리하게 사용 가능
PHP Application을 개발하여 운영할 때 한 서버에 여러개의 Web Site를 운영할 수 없지만 Docker는 가능!
개발,테스트,서비스 환경을 하나로 통일하여 효율적으로 관리할 수 있다
docker [명령어] --help
# run : docker container 만들기
docker run -[명령어] [image]
docker run -itd -name [이름] [OS]
docker run -it [이름] **/bin/sh
-it : 쉘로 진입
-d : 백그라운드에서도 실행**
# exec : docker container에 들어가기
docker exec -it [이름] /bin/sh (-itd 안됌)
# 3초마다 hi를 띄우는 docker container 만들기
docker run --name myrepeat -itd ubuntu bash -c "while true ; do echo hi ; sleep 3 ; done"
# container log 보기
docker logs myrepeat
# container 쉘로 들어가기
docker exec -it myrepeat bash
# 쉘에서 log 확인
ps aux
# docker가 재부팅되어도 살아있는지 (systemctl restart docker : docker 재시작)
docker run -itd --restart=always --name ysleealpine alpine
# Exited 상태인 서버 한꺼번에 살리기
docker start $(docker ps -q -f status=exited)
# 실행중인 서버 한꺼번에 삭제
docker rm $(docker ps -aq) -f
</aside>
<aside> 💡 Docker 구성 요소
Docker Registry
Docker Repository를 운형하는 Server
hhtp://hub.docker.com
hub.docker.com (Registry)의 ezra1044/centosyslee(Repository)가 docker repository이다
Docker Repository
Docker Image들을 저장해 둔 장소
docker search apache : Repository에서 apache 검색
Docker Container
Applocation을 실행하고 서비스하는 모든 환경을 갖춘 소프트웨어 I
</aside>
<aside> 💡 Docker Image 및 Container 관리하기
# nginx 과거 포트번호 보기
docker history nginx | grep -i expose
# 가장 많이 사용하는 docker 명령어
docker volume create convol : 지정하여 사용하기
docker run --name con1 -itd -v convol:/data alpine
(-v : volume , convol:/data : convol container안에 data directory 만들기
### volume 실습 ###
docker volume create web : web이라는 volume을 만듬
find / -name "web" : web이라는 디렉토리 위치를 찾는다
결과 : /var/lib/docker/volumes/web
cd /var/lib/docker/volumes/web -> _data 란 directory가 있었다
echo "I'm listening" > index.html # "I'm listening"이라는 내용의 index.html 파일을 만듬
docker run -d --name myweb httpd
docker exec myweb find / -name "index.html" # index.html을 myweb container 디렉토리의 경로를 찾는다
결과 : /usr/share/nginx/html/index.html
docker rm myweb -f myweb : 컨테이너 제거
# web volume경로에 있는 데이터를 가지고 web1,web2,web3,web4 container를 만듬
docker run -d --name web1 -v web:/usr/share/nginx/html/ nginx
docker run -d --name web2 -v web:/usr/share/nginx/html/ nginx
docker run -d --name web3 -v web:/usr/share/nginx/html/ nginx
docker run -d --name web4 -v web:/usr/share/nginx/html/ nginx
docker exec web1 curl localhost : web1 의 내용을 확인하면 I'm listening 확인
###########################################################################
docker network ls : docker의 network 확인
# a1,a2,b1,b2 container 만듬
docker run -itd --name a1 --net=connect alpine
docker run -itd --name a2 alpine
docker run -itd --name b1 --net=connect alpine
docker run -itd --name b2 --net=connect alpine
docker exec a1 hostname -i -> 172.19.0.2
docker exec a2 hostname -i -> 172.17.0.2
docker exec b1 hostname -i -> 172.19.0.3
docker exec b2 hostname -i -> 172.19.0.4
docker exec a1 ping 172.19.0.3 : a1 >> b1 통신 **o**
docker exec b2 ping 172.19.0.2 : b2 >> a2 통신 **x**
Why?
ㅁa1,a2,b2 같은 스위치 사용 b1은 따로 사용하기 때문
+Plus
ttl: 64 -> 목적지 리눅스 라우터 2개 통과 >> 62
ttl: 128 -> 목적지 윈도우 라우터 4개 통과 >> 124
docker history jesuswithme/verify-pod # jesuswithme/verify-pod 포트보기
docker run -d -p 80:80 jesuswithme/verify-pod # docker 80번포트로 jesuswithme/verify-pod 이미지를 이용해 container 만들기
docker run -d -p 8080:80 jesuswithme/gosmall # docker 8080번포트로 jesuswithme/gosmall 이미지를 이용해 container 만들기
curl <http://localhost:80> : 80번포트 확인
결과 : 0466bb17586c
curl <http://localhost:8080>
결과 : var id = 317815 ;
</aside>
<aside> 💡 Docker Custom Image 운영하기
<aside> 💡 Docker image생성하기
master에 있는 mysql을 node1, node2에서 쓸 수 있게 image save
>만약 인터넷이 안되는 node가 있다면... docker pull을 못하니
# mysql을 .tar로 압축하고 저장
docker image save [저장할이미지이름] > [파일이름.tar]
docker image save mysql > mysql.tar
# 저장된 mysql.tar, alpine.tar, busybox.tar, ubuntu.tar를 node1,node2의 /root/폴더로
scp [파일이름] [컨테이너이름]:[저장할위치]
scp mysql.tar node1:/root/
# 이미지 파일 로드하기
docker image load -i [파일이름]
docker image load -i alpine.tar
+ docker history 보기
docker (image) history [이미지이름]
</aside>
<aside> 💡 Dockerfile을 사용하여 docker image 생성
#FROM: dockerhub에서 이미지 다운로드
#RUN :nginx 설치 nginx.conf에 daemon off chown: 소유자를 바꿈
#VOLUME : docker밖 호스트에서 파일 작업을 할 수 있게 해줌.
#WORKDIR 실행
#CMD 실행되는 것
wget http://
# dockerfile 설치 .: 현재 디렉토리
docker build -t [이미지이름] [dockerfile이 위치한 디렉토리위치]
docker build -t spg9468/polytech0709 .
# docker 실행 -d하는 이유 : 백그라운드 실행
docker run -d --name mycon100 -p 8888:80 spg9468/polytech0709
# VOLUME 실습
-/data/에 polytech.file 만들기
touch polytech.file
-Ctrl+d로 호스트로 나와서 find / -name "polytech.file"
find / -name "polytech.file"
-나온 경로로 작업
touch /var/lib/docker/volumes/59fd8677a888de439688b2ab4d8a2f3c77e4f108f9a620280fad16ba312cc4be/_data/yslee.txt
+ docker image 이름 하나더 붙이기
docker tag spg9468/polytech0709 spg9468/ptnginx0709
+ docker image 삭제
docker rmi [이미지이름]
+ docker ps에서 핑
0.0.0.0:8888→ 80/tcp : TCP 버전 4
:::8888→80/tcp : TCP 버전 6
# node2(다른 환경)에서 volume을 사용해서 container 만들기
-만들기
docker run -d -p 8080:80 --name mycon200 -v /root/:/data/ spg9468/ptnginx0709
-확인
curl localhost:8080
+ 중지된 container 한꺼번에 삭제
docker rm $(docker ps -q -f status=exited)
docker system prune
dangling images > 중간단계 image <none> ≒ 캐시
+ docker inspect (docker 상세정보)
docker image inspect alpine
docker container inspect con10
docker network create polynet
docker volume ls
docker volume inspect web
# Dockerfile
FROM c7-tree:v1
RUN yum -y install epel-release
RUN yum -y install nginx
CMD ["nginx"]
EXPOSE 80
docker build -t c7-tree-nginx:v2 .
# Scripts 파일 만들기
-down.sh
#!/bin/bash
docker run -itd --name con10 -v convol:/data centos:7
docker exec con10 yum -y install wget
docker exec con10 wget -O /data/index.html <http://www.nginx.com>
docker exec con10 wget -O /data/Dockerfile <http://down.cloudshell.kr/docker/Dockerfile>
docker rm con10 -f
ls -l /var/lib/docker/volumes/convol/_data/
</aside>
<aside> 💡 Private Docker Registry
conainer registries 생성하기
Azure - private > 비공개
dockerhub - public > 공개
docker login [서버IP] -u [userid] -p [password]
docker push **[image파일이름]**
image 파일 이름 형식: [서버IP]/[이미지이름]
(≒ docker push spg9468/polytech0709)
-Test
★ 다른 node에서
docker pull [image파일이름]
</aside>
<aside> 💡 Docker를 GUI로 관리
master
# volume 생성
docker volume ls
docker volume create portainer_data
# docker container 생성
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce
+ TEST
포트포워딩 >> TCP | 192.168.56.1 | 9000 | 10.0.2.10 | 9000
인터넷 창 > 192.168.56.1:9000
portainer ID:admin
portainer PW:!이름+번호
원격 docker host
node1
# docker.service 파일 수정
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// **-H tcp://0.0.0.0:2375**
systemctl daemon-reload
systemctl restart docker
Portainer Site
Environmets → Add Environment → Docker→ Start Wizard → So Name: node1 , Environment URL : 10.0.2.11:2375
</aside>
<aside> 💡 다양한 Data volume 활용하기
Docker 데이터 볼륨은 data를 container가 아닌 Dock host에 저장한다.
# docker volume 확인
docker volume ls
# docker volume 전체삭제
docker volume prune
# docker volume 생성
docker volume create [이름]
# docker mount PATH 확인
docker volume inspect condir
+ TEST
docker run -itd --name testcon -v condir:/data alpine
docker run -itd --name samplecon -v condir:/lab centos:7
docker run -itd --name con100 -v /data alpine 와 차이점
docker exec con100 touch /data/hahaha.txt
find / -name "hahaha.txt"
결과 : /var/lib/docker/volumes/1b764d31b35046609089f4db60abb0ac4eaac1ae1282fddebcff7ba7099c1fab/_data/hahaha.txt
※ 다소 복잡해서 비추천
/usr/share/nginx/html/index.html
/usr/local/apache2/htdocs:/var/lib/docker/volumes/myhttpd/_data
docker run -itd --name con200 -v /lab:/data alpine
docker run -itd --name con300 -v /lab:/poly alpine
※ 관리가 안됌
docker exec -it testcon /bin/sh
cd /data
touch hi.txt
Ctrl + d
docker exec -it samplecon bash
cd /lab
ls
결과 : hi.txt
touch from.samplecon
ls
결과 : hi.txt from.samplecon
Ctrl + d
docker volume inspect condir
>>>"Mountpoint":"/var/lib/docker/volumes/condir/_data"
cd /var/lib/docker/volumes/condir/_data
ls
결과: from.samplecon hi.txt
#컨테이너를 만들 때 volumes을 사용 유/무 확인
docker container inspect samplecon | grep volumes
**master**
# docker host의 특정한 dir을 data volume으로 사용하기
docker run --name myweb80 -d -v /root/data/:**/usr/share/nginx/html** -p
80:80 nginx
**/usr/share/nginx/html** //nginx가 있는 디렉토리
docker run -d --name myhouse -v /lab/web/:/usr/share/nginx/html -p 8080:80 nginx
**container가 달라도 volumes을 같이 쓸 수 있다.**
# NFS server의 공유 볼륨을 container Data volume으로 사용
**node2(nfs server)설정 ---> 저장소**
/// NFS client가 사용할 수 있도록 directory를 공유한다
yum install nfs-utils -y
mkdir /consharedvol
chmod 777 /consharedvol
ls -l /consharedvol
touch /consharedvol/welcome.txt
vi /etc/exports
**/consharedvol 10.0.2.0/24(rw,sync,no_root_squash)** /// 설정파일인 /etc/exports을 편집한 후 저장
systemctl disable firewalld --now
exportfs -a /// 파일에서 수정한 내용을 적용
exportfs
exportfs -v /// 확인
결과: /consharedvol 10.0.2.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
systemctl restart nfs
**master
-host 디렉토리에 연결**
showmount -e node2 (어떤 파일이 공유 되어있는지)
결과 : Export list for node2:
/consharedvol 10.0.2.0/24
mkdir /mnt/nfs #####파일 저장할 디렉토리 생성
mount -t nfs node2:/consharedvol /mnt/nfs ### 생성한 디렉토리에 node2 연결
df -h
ls -l /mnt/nfs
+ umount /mnt (mount 없애기)
ls -l /mnt 확인하면 없음
**-container 디렉토리에 연결**
# nfsvol 볼륨 생성 (mount 되어 있어야함!!)
docker volume create --name nfsvol --driver local --opt type=nfs --opt o=addr=**10.0.2.12**,rw --opt device=:/consharedvol
docker volume ls
**볼륨이름** **container저장소**
docker run -itd --name mygugu -v **nfsvol**:**/data** centos:7
docker exec -it mygugu /bin/bash
cd /data
ls -l 아까 **node2에서 만든 파일(welcome.txt)이 있으면 성공!!!**
Ctrl + d
</aside>