-cmd 명령어

cmdlist.txt

<aside> 💡 Why? Container를 사용하는가

ex 신발가게 > 가게가 불타면 장사x | 신발이 타면 장사 가능 가게를 여는거 | = 서버를 여는

서버 운영자 → 데이터 백업

서버가 터지면 → 서버열고 데이터 백업된걸 입력

처음부터 서버 3개~4개 운영 (같은 공간 — 클러스터링) Scale in/out이 쉬워서 컨테이너 사용

  1. 안정성 (쿠버네틱스 >> 문제 발생할 거같다 하면 예비 container로 “자동”으로 바꿈 / 업데이트 할 때 contaioner1 (업뎃중) container2(서버대체)로 대체품으로 사용 가능)

  2. Scale in/out 쉬움

  3. 배포가 쉬움 (※ 데이터는 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>