22.02.10

Docker

docker 설치 및 환경 구축

서버1에서 centos 계정으로 로그인

사전 패키지 설치
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

yum 저장소 설정하기 (yum-config-manager로 docker-cd 패키지 저장소에 연결)
sudo yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>

docker-ce 설치
sudo yum install -y docker-ce docker-cd-cli containerd.io

서비스 실행 및 활성화
sudo systemctl start docker
sudo systemctl enable docker

docker 그룹 지정
sudo usermod -aG docker $USER 
//docker 그룹에 사용자를 추가하는 것은 서비스에 좋지 않지만 학습 환경을 위해 사용

docker 버전 확인
docker version

hello world 컨테이너 실해앻보기
docker run hello-world

docker 이미지 관련 명령어

이미지 다운로드
도커 허브에 들어가서 [허브의ID]/[REPO]:[TAG : Version]으로 이루어진 이미지를 보고 다운한다.
docker pull [REPO]:[TAG]
//docker pull [IMG] 만하면 태그에 자동으로 최근 이미지를 다운시켜준다.

이미지 검색
docker search [IMG] 
//보통 offical image를 다운 받는게 좋다. 해킹 우려

이미지 관리
docker images  : 다운받은 여러 이미지 파일들을 보여준다.

이미지 삭제
docker rmi [IMG] : 특정 IMG를 삭제할 수 있다. 단, 컨테이너로 실행되지 않는 이미지만 삭제 가능하다.
// 컨테이너로 실행되는 이미지 삭제방법 : -f 옵션을 붙여준다
ex) docker rmi -f centos:latest

이미지,컨테이너 자세한 정보 보기
docker inspect [IMG/CONTAINER] 
//결과 중 중요하게 볼 것들 
config > "cmd"  :  명령어 실행 부분
config > "Volumes" : 볼륨 생성 부분
config > "WorkingDir" : 작동디렉토리 경로
config > "Entrypoint" : 컨테이너가 실행하는 어플리케이션

이미지 복사 및 불러오기
docker save -o [name].tar [IMG 1] .... [IMG n] : 여러 이미지를 [name].tar의 압축파일로 저장
// -o 옵션을 사용해 저장할 파일을 정해준다.
// tar tf [name].tar로 파일의 내용을 볼 수도 있다.

docker load -i [name].tar : 여러 이미지들로 구성된 압축 파일을 풀기
// -i 옵션을 이용해 특정 아카이브 파일을 풀 수 있다.

docker 컨테이너 관련 명령어

컨테이너 확인
docker ps : 실행중인 컨테이너를 확인
docker ps -a : 실행중인/실행중이지 않은 컨테이너 모두 확인

컨테이너 생성
docker create [option] [IMG] : 이미지를 컨테이너로 생성
//[option] : -it : 쉘 프로그램 같은 이미지를 컨테이너로 생성할때 쓰인다.
						 --name [name] : 컨테이너의 이름을 지정할떄 쓰인다. [꼭 써주기]

컨테이너 실행
docker start [option] [컨테이너] : 실행 중이지 않은 컨테이너를 실행한다.
//[option] : -ai : 쉘 프로그램용 컨테이너를 실행시킬때 사용하면 컨테이너에 바로 접근이 가능하다.
// 컨테이너에서 호스트 쉘로 돌아오려면 ctrl+P+Q 를 입력한다.

컨테이너 생성 및 실행, 이미지 다운로드 (pull+ create+ start 기능)
docker run [option] [IMG] : 다운되지 않은 이미지를 다운받아 생성하고 실행한다.
//option : -it : 쉘 이미지를 실행할때
					 -d : 분리모드로 실행하고 싶을 때
				   --name : 컨테이너 이름 지정
					 -e "[수정사항]" : 에러가 났을때 고칠 수 있다.

컨테이너 상태 확인
docker stats [option] [컨테이너] : 컨테이너의 실시간 상태 확인
// 일시적 상태 확인시 docker stats --no-stream [컨테이너] 을 사용한다.
// 전체 컨테이너의 상태 확인시 docker stats -a 를 사용한다.

컨테이너 중지 및 제거
docker stop [컨테이너] : 컨테이너 중지
docker rm [option] [컨테이너] : 실행 중이지 않은 컨테이너 제거
//[option] : -f : 실행중인 컨테이너도 제거할 수 있다.

컨테이너 재시작
docker restart [option] [컨테이너] : 실행 중이지 않은 컨테이너 재시작
//[option] : run 옵션과 동일

컨테이너 실행 시 유용한 설정
(1) 환경변수 : 해당 컨테이너에 run -e 옵션을 통해 환경변수를 바꿀 수 있다.
ex) docker run -it --name os3 -e "LAB=docker" centos:latest
=> centos 최근 이미지를 os3라는 컨테이너 명으로 하고 컨테이너 내의 LAB파일의 이름을 docker로 바꾼다.

(2) cpu 제어 : 해당 컨테이너의 cpu 자원을 --cpus 옵션으로 제한 할 수 있다.
 //제한하지 않으면 100%의 사용률을 보인다.
docker run --cpus [소수점 ex) 0.5 = 50% 자원사용] [컨테이너]
ex) docker run --cpus 0.5 -it --name os3 centos:latest

(3) 메모리 제한 : 해당 컨테이너의 메모리를 --memory [크기]m 옵션으로 제한 할 수 있다. 
//제한하지 않으면 호스트의 메모리를 다 사용할 수 있다.
docekr run --memory [크기]m [컨테이너]
ex) docker run -itd --name os3 --memory 1024m centos.latest

확인시 docker stats [컨테이너명] --no-stream으로 확인하면된다.

(4) 자원 제한 변경 : update 명령어를 사용해 제한된 자원을 변경할 수 있다.
docker update [option] [컨테이너명]
ex) docker update --memory 1400m centos.latest

컨테이너 접근 : 분리모드로 실행 중인 컨테이너에 접근할 수 있다.
docker attach [option] [컨테이너] 
//잘 사용하지 않는다. 컨테이너 내에 기본 쉘 프로그램이 없어 안쓰는 것이 좋다.

컨테이너 간접 접근 실행 : 실행중인 컨테이너에 명령을 실행한다. 
docker exec [컨테이너] [COMMAND] 
ex) docker exec os2 ip a s : os2 컨테이너에서 ip주소를 확인한다.

컨테이너 프로세스 확인 : 실행중인 프로세스의 정보를 확인한다.
docker top [컨테이너]
ex) docker top os2 
	=> UID       PID        PPID    등

컨테이너 로그 확인[실행안되는 컨테이너 에러 잡는용]: 실행 중인 컨테이너의 로그를 확인한다.
docker logs [컨테이너]

컨테이너에 파일 복사[호스트에 있는 파일을 컨테이너에 복사하거나 반대로도 할 수 있다.]
docker cp [컨테이너]:[복사할 파일] [호스트의 저장할 경로]
docker cp [호스트의 저장할 경로] [컨테이너]:[복사할 파일]
ex) docker cp web2:/usr/local/apache2/htdocs/index.html /tmp/index.html
web2컨테이너에있는 index.html파일을 호스트의 /tmp/경로에 index.html로 복사

컨테이너 안 파일 변경상태 체크
docker diff [컨테이너]
=> C : 컨테이너 내의 파일이 추가되거나 삭제됨
	 A : 파일이 추가됨
   B : 파일이 변경됨
   D : 파일이 삭제됨

도커 볼륨

볼륨을 사용하기 위해서 docker 볼륨을 생성해서 컨테이너와 연결시켜줘야 한다. 이때 관련 명령어를 확인해보겠다.

볼륨 생성 : 도커 볼륨을 생성한다.
docker volume create [vol] 

모든 볼륨 확인하기
docker volume ls 

볼륨에 연결된 호스트 디렉토리 위치 확인하기
docker inspect [vol]

생성된 볼륨을 컨테이너에 연결해주기  : -v 옵션을 이용해 볼륨을 생성하고 컨테이너에 연결할 수 있다.
docker run [option] -v [vol]:[볼륨의 데이터를 저장할 컨테이너의 경로] [컨테이너]
ex) docker run -d --name web3 -v vol1:/usr/local/apache2/htdocs:ro httpd:latest
: httpd 이미지를 web3라는 이름으로 컨테이너 만들고 /usr/local/apache2/htdocs라는 경로에
vol1이라는 볼륨의 데이터를 저장한다. 이떄 읽기 전용(ro)으로 연결된다.

도커 네트워크

네트워크는 여러 컨테이너를 연결하거나 외부 네트워크를 연결시키기 위해 사용한다. 
보통 bridge 네트워크 드라이브(=장치)를 사용한다.

네트워크 드라이브 목록 확인하기
docker network ls : 네트워크 드라이브의 목록을 확인할 수 있다.

**bridge 네트워크 : 컨테이너가 사용하는 프라이빗 네트워크이며 같은 브릿지에 연결되면 컨테이너
끼리 ip주소로 통신할 수 있다. 이때 NAPT(NAT 상위 버전) 통신을 사용하며 외부에서 브릿지로
통신하려면 포트포워딩을 사용해야한다.
//도커 설치시 docker0인 리눅스 브릿지가 생성된다.

birdge 드라이버를 사용하는 net1 네트워크 생성하기**
docker network create --subnet 192.168.100.0/24 --gateway 192.168.100.254 net1
=>서브넷마스크를 가지고, 게이트웨이를 가진 net1 bridge네트워크가 생성된다.

브릿지네트워크와 컨테이너를 연결하기
docker run [option] --network [network 명] [컨테이너]
ex) docker run -itd --name bridgenet --network net1 cetnos:latest
=> net1이라는 네트워크를 bridgenet이라는 centos기반 컨테이너에 연결해준다.
 
호스트 네트워크 연결
: 호스트에서 컨테이너의 네트워크 격리를 해제해 호스트의 네트워크 정보를 공유해 사용하는 방법
이때 호스트 네트워크를 사용하는 컨테이너의 포트가 호스트에서 사용하는 포트와 같으면 충돌이난다!
docker run [option] --network host [컨테이너]

null 드라이버 
컨테이너에 네트워크 기능을 사용하지 않을 때 사용한다. //잘 안쓴다.
docker run [option] --network null [컨테이너]

overlay 드라이버
서로 다른 호스트를 연결해 통신할 수 있도록 한다.

macvlan 드라이버
실제 네트워크에 직접 연결해야 할 때 사용한다.

//bridge 드라이버를 제외한 것들은 개념만 알고 있자.

컨테이너 통신

컨테이너의 통신은 링크와 포트포워딩방식을 가지고 있다. 

**링크(run --link [통신 컨테이너] : [별칭]) 
컨테이너들끼리 서로 통신할때 같은 bridge 네트워크를 사용해야 하며,
컨테이너 간 이름 또는 별칭으로 통신해야할 때 링크기능을 사용한다.**
docker run [option] --link [통신할 컨테이너] [컨테이너]
//별칭을 사용해 컨테이너들 끼리 통신할 수도 있다.
docker run [option] --link [통신할 컨테이너]:[별칭] [컨테이너]
ex) docker run -itd --name test_os --link test_web:http centos:latest
centos 이미지를 test_os 이름의 컨테이너를 만들고 http별칭을 가진 test_web 컨테이너와 통신을 위해 연결
 

**포트포워딩(run -p [호스트 포트] : [컨테이너 포트] ) 
브릿지 네트워크를 사용하는 모든 컨테이너는 외부에서 접근할 때 포트포워딩을 해주어야 한다.
docker run [option] -p [host port]:[컨테이너 포트] [컨테이너]
ex)docker run -d --name test_web2 -p 8080:80 httd:latest
httpd 이미지를 test_web2 이름의 컨테이너로 만들고 호스트 8080번 포트와 컨테이너 80번 포트를 연결해
외부 서버에서 8080번 포트로 데이터를 전송하면 80번 포트로 받을 수 있다.**

이미지 태그 및 업로드

이미지 태그 : 이미지태그는 이미지를 업로드하거나 다운로드할때 중요하다.
보통 형식은 허브ID/repo 이름:태그 형태를 가진다.

docker tag [태그할 컨테이너] [허브ID]/[REPO 이름]:[태그명] 
EX) dcoker tag centos:latest test/docker:centos
centos 컨테이너를 test라는 허브id에 있는 docker 저장소에 centos라는 버전으로 태그한다.

이미지 업로드
이미지 업로드를 위해 허브도커에 로그인을 먼저한 후 업로드한다. 업로드 후 로그아웃을 해줘야 보안상 문제가 없다.

허브도커 로그인
docker login 
=> login : 자신의 login
=> password : id에 해당되는 패스워드

이미지 업로드 : 이미지 업로드는 이미지 태그를 이용해 업로드한다.
docker push [허브ID]/[REPO 이름]:[태그명]

이미지 확인
docker search [허브ID]/[REPO 이름] 또는 [허브ID]
이미지를 확인 할 수 있다. 단, 태그는 확인이 되지 않으므로 허브도커 사이트에 들어가서 확인해야 한다.

호스트 이미지 확인
docker images : 호스트 내에 있는 이미지를 확인 할 수 있다. [26일차 이미지 명령어 확인해보기]

허브도커 로그아웃
docker logout

이미지 태그 및 업로드 전체 예제
docker login 
=> login : test
=> passwd : testpwd

docker tag centos:latest test/docker:centos  
//centos:latest 이미지를 test계정의 docker 저장소에 centos라는 버전으로 태그한다.

docker push test/docker:centos => test/docker 저장소에 업로드 된다.

docker search test/docker => 허브도커에 업로드된 이미지를 확인할 수 있다.

docker logout => 로그아웃을 꼭 해줘야 한다.

이미지 제작

docekr commit [컨테이너] [도커ID]/[REPO]:[TAG] : 컨테이너를 이미지로 저장한다.

이미지 추출 및 이미지화