[2024.10.26]
09. Docker 네트워크 관리
1. Docker 네트워크 관리
# docker network ls
# docker container run --rm busybox ip address
# ip address show docker0
컨테이너가 구동될 때 네트워크 스택을 생성하고 기본적으로 bridge 네트워크에 연결한다
2) host 네트워크
# docker container run --rm --network=host busybox ip address
# ip address
host 네트워크는 호스트의 네트워크 장치를
컨테이너가 그대로 사용하는 유형이다
실제 호스트에서 ip address를 실시하여 위의 내용과 동일한지 확인한다
3) none 네트워크
# docker container run --rm --network=none busybox ip address
가장 자주 쓰는 네트워크는 bridge 네트워크다
none 네트워크는 컨테이너에 lo 네트워크 장치만 생성하기 때문에
호스트 및 다른 컨테이너와 통신할 수 없는 유형이다
3. Docker 네트워크 생성
4) 네트워크 생성 예제
# docker network create br0
# docker network ls
# ip address
# docker network create -d bridge --subnet 192.168.100.0/24 --gateway 192.168.100.254 br1
# docker network ls
# ip address
bridge 드라이버를 사용하는 br0 네트워크를 생성하고,
ip address를 이용하여 설정한 내용이 동일한지 확인한다
bridge 드라이버를 사용하는 br1 네트워크 생성 및
서브넷/게이트웨이를 설정하고 해당 명령 역시 ip address로 확인한다
4. Docker 네트워크 정보 확인
1) 명령어 형식
# docker network inspect [옵션] 네트워크_이름
2) 옵션
--format,-f Format the output using the given Go template --verbose, -v Verbose output for diagnostics
3) 명령어 사용 예시
# docker network inspect mynet
# docker network inspect --format="{{ GO template }}" mynet
4) Docker 네트워크 상세 정보 확인 예제
# docker network inspect br0
# docker network inspect br1
# docker container run -it --rm --name testserver --network=br1 centos
# docker network inspect br1
# docker container run -it --rm --name testserver --network=br1 centos ip address
# docker container run -it --rm --name testserver --network=br1 --ip 192.168.100.101 centos ip address
br0과 br1을 확인했을 때 각각의 네트워크가 다른 것을 알 수 있다
네트워크를 br1으로 설정 후 ip address를 확인하면 192.168.100.1번의 IP를 확인할 수 있다
cls를 하게 되면 --rm을 사용했기 때문에 실행 중인 컨테이너가 없다고 나온다
네트워크를 br1으로 설정 후에 IP를 수동으로 설정할 수도 있다
4) Docker 네트워크 연결 및 해제 예제
# docker container run -d --name myweb --network=br0 nginx
# docker container inspect myweb
# docker network disconnect br0 myweb
# docker container inspect myweb
# docker network connect br1 myweb
# docker container inspect myweb
# docker network inspect br1
네트워크 br0를 설정하고 확인 시 구동 중인 것을 확인 후
inspect로 myweb의 정보를 확인하면 br0에 대한 정보가 나오며,
기본 게이트웨이와 IP 주소를 확인할 수 있다
확인 후 해당 br0의 네트워크를 해제시킨다
연결 해제시킨 후의 myweb을 살펴보면
네트워크 정보가 보여야 할 곳에 아무것도 보이지 않게 된다
이번에는 br0가 아닌 br1을 myweb에 연결시킨다
그렇게 되면 myweb의 정보에서는 br1에 대한 네트워크 정보를 확인할 수 있다
6. Docker 네트워크 삭제
1) Docker 네트워크 삭제 예제
사용하지 않는 br0의 경우 바로 삭제되지만,
현재 br1은 사용 중이기 때문에 오류가 나타난다
현재 myweb 컨테이너가 br1을 사용하고 있으므로
삭제하려면 사용 중인 br1을 중지시키고,
Exited 상태로 만든 후 삭제시키면 된다
7. Docker 네트워크 관리 예제
1) host 네트워크
mynginx 컨테이너를 구동하고
네트워크 구동 확인한다
ip address를 통해 네트워크 정보를 확인한다
mynginx를 /bin/bash 셸로 실행시킨 후
host 네트워크는 호스트(CentOS) ens33을
그대로 사용하기 때문에 새로운 인터페이스가 생성되지 않는다
또한, 컨테이너 쪽으로 서비스 요청이 넘어가지도 않는다
그렇기 때문에 1개의 컨테이너만 구동할 경우 사용한다
2) bridge 네트워크
alpine1과 alpine2 컨테이너를 구동한다
네트워크의 inspect를 살펴보면 드라이버가 bridge인 것과
컨테이너가 alpine1, alpine2 총 두 개가 생긴 것을 확인할 수 있다
alpine1 컨테이너에 attach를 진행하여 네트워크 설정 내용을 확인한다
그런 다음 통신도 가능한지 ping을 통해 확인할 수 있었다
/etc/hosts 파일에 127.17.0.3의 IP 주소와 alpine2 호스트 이름을 추가한다
호스트 파일에 이름을 추가하면 호스트 이름으로도 ping을 실행시킬 수 있다
현재의 셀에서는 ctrl+p+q로 누르고 나온다
프로세스를 유지하면서 컨테이너로 빠져나올 수 있으며,
exit를 하게 되면 모두 빠져나오게 되어 주의해야 된다
실습에 활용한 것들을 모두 확인했다면 마지막에는
다음 실습을 위해 컨테이너를 삭제시킨다
3) 사용자 정의 bridge 네트워크
이번에는 사용자 정의 bridge 네트워크를 생성하고 기본 정보를 확인한다
드라이버가 bridge로 설정되어 있으며,
config 부분에서 서브넷과 게이트웨이를 확인할 수 있다
3번 네트워크를 설정하지 않고 만들었기 때문에 기본 bridge를 사용게 된다
4번도 기본 bridge를 사용하는 걸로 설정했다
그렇기 때문에 현재 3, 4번이 기본 bridge를 사용한다
bridge inspect 하게 되면 3, 4번이 나오며 각각의 ip를 확인할 수 있다
alpinenet의 inspect도 확인하면 1, 2번의 ip를 확인 가능하다
다음은 alpine1 컨테이너에 attach 하여 각각의 컨테이너로 ping 테스트를 진행한다
같은 네트워크인 2번과 4번으로의 통신은 가능하나
이름으로 안 되기 때문에 ip를 넣어야 된다
서로 다른 네트워크기 때문에 통신이 불가능하다
이번에는 alpine4 컨테이너로 attach 후 ping 테스트를 진행하려고 한다
4번의 경우 모두 같은 네트워크기 때문에 1, 2, 3번과 모두 통신이 가능한 상태다
다 사용했다면 모두 삭제한다
이번에는 이미지는 삭제하지 말고 컨테이너와 설정한 네트워크만 삭제한다
4) '--link' 옵션을 이용한 컨테이너 구성
컨테이너 2(mysql)를 구동한다
--link 옵션을 이용하여 컨테이너 2(mysql)를 지정하여 컨테이너 1(wordpress)를 구동한다.
컨테이너 1(wordpress)에 접속하여 '/etc/hosts' 파일 내용을 확인한다
10. Docker 컨테이너 운용
1. Docker 컨테이너 운용
2. 구동 중인 컨테이너 연결
1) 명령어 형식
# docker attach [옵션] 컨테이너_이름
# docker container attach [옵션] 컨테이너_이름
testos 컨테이너를 구동시키고,
attach 명령어를 이용하여 testos 컨테이너 프로세스에 연결하고
exit 하면 컨테이너까지 종료시키게 되므로 ctrl+p+q로 빠져나온다
testos 컨테이너를 다시 구동하고 attach 명령어로 컨테이너 프로세스에 연결한다
*ctrl+p+q로 나오게 되면 컨테이너는 아직 살아 있으며, 셸만 빠져나오게 된다
이미지를 nginx로 하게 되면 기본 attach 값이 /bin/bash가 아닌
스크립트 파일이기 때문에 셸을 사용할 수 없다
이것도 마찬가지로 ctrl+p+q를 누르고 빠져나와야 된다
exit를 하게 되면 컨테이너까지 종료되는 것을 확인할 수 있다
다시 실행시키고 attach를 진행하고 ctrl+p+q로 빠져나와
컨테이너 상태를 확인하게 되면 여전히 실행 중인 것을 볼 수 있다
3. 구동 중인 컨테이너 프로세스 실행
1) 명령어 형식
# docker exec [옵션] 컨테이너_이름 컨테이너_명령어 [인수]
# docker container exec [옵션] 컨테이너_이름 컨테이너_명령어 [인수]
2) 명령어 사용 예시
① 컨테이너를 실행하고 실행 중인 컨테이너에 파일 생성
# docker container run -it --rm --name testweb ubuntu bash
# docker container exec testweb touch /tmp/file.txt
② 실행 중인 컨테이너에 bash 쉘 실행
# docker container exec -it testweb /bin/bash
③ 실행 중인 컨테이너에 bash 쉘 실행 및 변수 설정
# docker container exec -it -e VAR=1 testweb bash
3) 구동 중인 컨테이너 프로세스 실행 예제
testweb 컨테이너를 구동시키고, 컨테이너의 구동 상태를 확인한다
그런 다음 exec 명령을 이용하여 myweb 컨테이너에 명령을 실행한다
testweb 컨테이너의 bash 셸을 실행하여 컨테이너 안에서 명령을 실행한다
해당 부분의 실습을 마무리했다면
구동 중인 컨테이너를 삭제시키며 마무리한다
4. attach, exec 차이점 이해하기
1번의 경우에는 둘 다 사용 가능하지만,
2번의 testweb의 경우 기본 attach 값이
/bin/bash가 아니기 때문에 exec를 사용해야 된다
5. 동작 중인 컨테이너의 프로세스 및 리소스 확인
1) 명령어 형식
# docker top 컨테이너_이름 [옵션]
# docker container top 컨테이너_이름 [옵션]
# docker container stats 컨테이너_이름 [옵션]
2) 구동 컨테이너의 프로세스 확인 예제
3) 구동 컨테이너의 리소스 확인 예제
6. 구동 중인 컨테이너의 포트 전송 확인
1) 명령어 형식
# docker port 컨테이너_이름 [PRIVATE_PORT[/PROTO]]
# docker container port 컨테이너_이름 [PRIVATE_PORT[/PROTO]]
2) 명령어 사용 예시
# docker container port testweb
3) 구동 중인 컨테이너의 포트 전송 확인 예제
만약 컨테이너 구동 시 -p 옵션을 사용하지 않았다면,
다음 내용은 출력되지 않는다
7. 컨테이너 이름 변경
1) 컨테이너 이름 변경 예제
testweb 컨테이너 이름을 myweb으로 변경할 수 있다
8. 컨테이너와 호스트 간에 파일 복사
1) 컨테이너와 호스트 간에 파일 복사 예제
index.html 파일에 Test Web Page를 입력하고,
호스트 파일인 index.html 파일을
myweb:/usr/share/nginx/html/ 컨테이너로 복사한다
curl을 통해 해당 페이지의 내용을 확인한다
Test Web Page로 정상적으로 복사가 된 것을 확인할 수 있다
myweb 컨테이너 안에서 해당 디렉터리의 파일의 상세 정보를 확인해도
Test Web Page가 나오는 것을 확인할 수 있다
물론 컨테이너에서 호스트 쪽으로 파일 복사가 가능하다
9. 컨테이너와 이미지 내용 변경 사항 확인
이미지와 현재 컨테이너 상태를 비교해서 출력한다
컨테이너를 구동하여 diff를 실행하게 되면
최초 이미지에서 현재 삭제나 변경 유무가 없기 때문에 변동이 없다
확인을 위해 컨테이너를 실행시켜 bash 셸에서 변동 사항을 주고빠져나와 다시 diff로 확인하게 되면 확인할 수 있다
*a 추가, d 삭제, c 변경된 것
10. 구동 중인 컨테이너 로그 확인
logs 명령어를 사용하면 로그를 확인할 수 있고
-f 옵션을 사용하면 실시간으로 로그를 확인할 수 있다
웹 페이지를 실행시킨 다음
다시 확인하게 되면 로그가 하나 더 발생된 걸 확인할 수 있다
이번에는 attach로 실행시킨 다음 같은 작업을 진행한다
attach를 실행하여 작업한 내용은 로그에 다 기록된다
11. 'portainer.io'를 이용한 컨테이너 운용
1) 컨테이너 구동 및 생성
nginx 이미지와 bind mounts 방식의 볼륨을 이용한 myweb1 웹 서버 컨테이너를 구동한다
또한, apache 이미지와 bind mounts 방식의 볼륨을 이용한 myweb2 웹서버 컨테이너도 구동한다
컨테이너를 구동시키고 나면 항상 컨테이너 구동 상태를 확인한다
myweb1, myweb2 각각의 마운트 디렉터리에 index.html 파일을 생성한다
2) portainer.io 컨테이너 생성 및 구동
파일을 생성했다면 Portainer 웹 UI 컨테이너를 백그라운드에서
실행하고 9000번 포트로 접근할 수 있게 설정한다
3) portainer.io 컨테이너 웹 접속
웹 브라우저로 실행하여 portainer.io 컨테이너(http://192.168.2.10:9000)로 접속하고,
패스워드(toor1234!@#$로 입력)를 입력한 다음에 Create user 버튼을 눌러 접속한다
해당 화면까지 왔다면 Quick Setup 모드에서 Get Started를 클릭한다
다음으로 local을 클릭하면 위와 같은 화면이 나타난다
대시보드에서 현재 docker1 시스템에 존재하는
이미지, 컨테이너, 볼륨, 네트워크 갯수를 확인한다
좌측에 있는 Containers를 클릭하여 컨테이너 내용도 확인한다
4) portainer.io 웹 환경에서 컨테이너 구동
좌측 메뉴 Images를 클릭하여 이동한 후
mysql:5.7 이미지 이름을 입력하고 pull the image 버튼을 눌러 생성한다
다음은 Volumes 메뉴를 선택하여 mysqlvol의 이름으로 볼륨을 생성한다
마지막으로 컨테이너를 생성하기 위해 이름 및 설정을 진행하고
볼륨은 mysql:5.7을 선택한다
env의 이름은 MYSQL_ROOT_PASSWORD
패스워드는 password로 설정하고 생성한다
MovaXterm으로 돌아가서 컨테이너를 확인하게 되면 생성된 것을 확인할 수 있다
11. Docker 리소스 제한 및 모니터링
1. Docker 리소스 제한
1) 메모리 리소스 제한 옵션
2) 명령어 사용 예시
① 최대 메모리 용량 512M, swap 메모리 용량 512M 로 설정하고 초과되면 kill 실시
# docker container run -d -m 512m nginx
② 최소 메모리 500M 보장하면서 최대 1G 까지 사용 가능하고 초과되면 kill 실시
# docker container run -d -m 1g --memory-reservation 500m nginx
③ 최대 메모리 용량 200M, swap 메모리 용량 100M 로 설정하고 초과되면 kill 실시
# docker container run -d -m 200m --memory-swap 300m nginx
④ 최대 메모리 100M 으로 설정하고(스왑 메모리 없음) 초과되면 kill 실시
# docker container run -d -m 100m --memory-swap 100m nginx
⑤ 최대 메모리 200M 를 초과하면 OOM Killer 가 프로세스를 kill 하지 못하도록 설정(현재 적용 X)
# docker container run -d -m 200m --memory-swap 200m --oom-kill-disable nginx
2. CPU 리소스 제한
1) CPU 리소스 제한 옵션
2) 명령어 사용 예시
① 0.5 개의 CPU 사용 가능
# docker container run -d --cpus=".5" ubuntu
② 다른 컨테이너에 비해 2 배의 CPU 자원을 할당(다른 컨테이너에 대한 가중치)
# docker container run -d --cpu-share 2048 ubuntu
③ 다른 컨테이너에 비해 0.5 배의 CPU 자원을 할당
# docker container run -d --cpu-share 512 ubuntu
④ CPU 중 0 번부터 2 번 CPU 를 할당
# docker container run -d --cpuset-cpus 0-2 ubuntu
3. BLOCK I/O 리소스 제한
1) BLOCK I/O 리소스 제한 옵션
2) 명령어 사용 예시
① 블럭 I/O 를 5 분의 1(100/500)로 설정(다른 컨테이너에 비해 5 분의 1 정도의 block io 발생)
# docker container run -it --rm --blkio-weight 100 ubuntu /bin/bash
② 블록 write I/O 를 초당 1M 속도 제한
# docker container run -it --rm --device-write-bps /dev/sda:1mb ubuntu /bin/bash
③ 블록 write I/O 를 초당 10MB 속도 제한
# docker container run -it --rm --device-write-bps /dev/sda:10mb ubuntu /bin/bash
④ 초당 데이터 젂송량 제한(10 x 블록크기)
# docker container run -it --rm --device-write-iops /dev/sda:10 ubuntu /bin/bash
4. Docker 리소스 모니터링
1) 명령어 형식
# docker monitoring commands
2) 명령어 사용 예시
① 실행주인 컨테이너의 런타임 통계 확인
# docker stats [옵션] 컨테이너_이름
② Docker 호스트의 실시갂 event 정보를 수집해서 출력
# docker events -f container=<NAME>
③ cAdvisor(쿠버네티스에 내장되어 있으며, 구글이 개발한 GUI 환경 모니터링)
https://github.com/google/cadvisor
5. Docker 리소스 제한 및 모니터링 예제
1) 'epel-release', 'htop' 패키지를 설치
# yum -y install epel-release
# yum -y install htop
2) Host 시스템에서 CPU, 메모리 상태를 확인
top과 htop을 이용하여 실시간 CPU 사용량을 확인한다
또한, lscpu 명령어를 통해 CPU 코어의 수가 4개인 것을 확인했
lsmen 명령어를 통해 시스템에 총 3G의 메모리가 있는 것까지 알 수 있다
3) 'Dockerfile'을 이용한 'stress' 이미지 빌드
stress 명령어로 4개의 CPU 코어에 부하를 주며,
이를 백그라운드로 실행시키는 명령을 실행했다
htop으로 실시간 CPU 사용량을 살펴보게 되면
처음에 확인했던 것과 다르게 CPU 사용량이 현저히 높아진 것을 볼 수 있다
현재 CPU 부하 상태인 CPU를 찾아내고 해당 CPU를 모두 강제 종료 진행했다
이번에는 build라는 디렉터리를 생성하고, 그 디렉터리로 이동한다
그런 다음 Dockerfile 파일을 생성하고 내용을 추가한 후 해당 내용을 확인한다
다음은 docker 이미지를 빌드하고, 이미지 빌드 과정을 출력한다
마지막으로 이미지 목록을 확인하게 되면,
이 목록에서 새로 빌드된 stress 이미지 137MB가 추가된 것을 확인할 수 있다
4) 'stress' 애플리케이션을 이용한 메모리 제한
메모리를 100M로 제한하고 stress를 이용하여
80M 프로세스 1개를 5초 동안 제한하여 실행하면
프로세스 종료 없이 진행된다
150M 프로세스 1개를 5초 동안 실행하면 메모리 초과이므로
5초가 되기 전에 프로세스는 종료된다
--memory-swap을 설정하지 않으면 swap의 크기는
memory의 2배로 설정되기 때문에 150M 프로세스 1개는
5초가 되기 전에 종료되지 않는다
5) 'stress' 애플리케이션을 이용한 CPU 리소스 제한 I
호스트 CPU 정보 확인을 실시한다
CPU Index 1 번을 사용하는 'c1' 컨테이너를 구동하고 CPU 1 개에 대해서 부하를 발생시킨다
'htop'를 실행하여 1 번 CPU 가 100% 사용중인지 확인한다
6) 'stress' 애플리케이션을 이용한 CPU 리소스 제한 II
CPU 가중치를 적용하여 컨테이너를 구동한다
그런 다음 컨테이너의 구동 상태를 확인한다
# docker container stats
각각의 컨테이너들의 CPU 사용 상태를 확인한다
7) 컨테이너 리소스 제한 - Block I/O 제한하기
Host 시스템 디스크 이름을 확인한다
1mb로 실행하여 10초 정도 걸린다는 뜻이다
10mb의 경우 1초 정도 걸린다고 생각하면 된다
20배 정도 차이가 난다
8) cAdvisor 설치 및 실행
VERSION=v0.49.1
sudo docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:$VERSION
cAdvisor 실습을 위한 컨테이너를 구동한다
컨테이너의 구동 상태를 확인하고,
실제 PC 브라우저를 실행하여 구글 검색을 통해 cadvisor 다운로드 및 설치한다
위의 내용을 복사하여 붙여넣고 cadvisor 컨테이너를 구동한다
실제 웹 브라우저를 이용하여 cadvisor(http://192.168.2.10:8080)에 접속한다
cadvisor가 제공하는 정보들을 확인한다
상단의 Docker Container 부분을 클릭하여 추가적인 정보를 확인한다
Subcontainers 'myweb'을 클릭하고 들어가게 되면
CPU, Memory 제한 내용을 확인할 수 있는 페이지가 나온다
12. Docker 이미지 생성
1. Docker 이미지 생성
2. 컨테이너를 이용하여 이미지 생성
1) 명령어 형식
# docker commit [옵션] 컨테이너_이름 이미지_이름:태그
# docker container commit [옵션] 컨테이너_이름 이미지_이름:태그
2) 옵션
3) 명령어 사용 예시
# docker container commit -a "kim jung woo" webserver kim10322/testweb:1.0
# docker image inspect --format="{{ .Author }}" kim10322/testweb:1.0
4) 컨테이너를 이용하여 이미지 생성 예제 I
먼저 httpd 이미지를 다운로드한다
다운로드 후에 testweb1 컨테이너는 생성만 하고,
testweb2 컨테이너는 구동까지 진행한다
컨테이너의 구동 상태를 확인한 다음
생성된 컨테이너 testweb1 및 구동된 컨테이너 testweb2를
이용하여 이미지를 생성한다
inspect를 이용하여 자세한 정보를 살펴보게 되면
각각의 컨테이너에 RepoTags와 Comment를 확인할 수 있다
5) 컨테이너를 이용하여 이미지 생성 예제 II
원래라면 ubuntu 이미지를 다운로드해야 되지만,
이미 있기 때문에 별도의 설명 없이 진행한다
이번에는 testweb3 컨테이너를 이용하여 testweb3 이미지를 생성한다
꼭 내 이름이 아니어도 본인의 이름을 넣어도 된다
이미지 생성 후 testweb3 이미지가 생성된 것을 확인한다
다음으로 'ubuntu' 이미지와 'kim10322/testweb3' 이미지 내용 중에 Layer 정보를 확인한다
현재 1개의 Layer 구성이 확인된다
testweb3의 inspect를 확인하면 Layer가 추가된 것을 확인할 수 있다
현재 Layer가 두 개가 확인된다
testweb3로 bash 셸을 실행하여 확인 시에도 Test Make Image를 확인할 수 있다
다음 내용을 알아보기 위해 모든 컨테이너를 삭제하여 마무리한다
3. 컨테이너의 파일 및 디렉토리를 tar 파일로 생성
파일 및 디렉터리를 tar 파일로 생성하는 테스트를 진행했다
1) 명령어 형식
# docker export [옵션] 컨테이너_이름
# docker container export [옵션] 컨테이너_이름
2) 명령어 사용 예시
① 현재 동작 중인 컨테이너를 myweb.tar 파일 만들기
# docker container export myweb > myweb.tar
# docker container export myweb -o myweb.tar
② 현재 동작 중인 컨테이너를 /app 디렉토리에 export 실시
# docker container export | tar xf - -C /app
3) 컨테이너의 파일 및 디렉토리를 tar 파일로 생성 예제
testweb1 컨테이너는 생성만 하고, testweb2 컨테이너는 구동까지 진행한다
test라는 디렉터리를 생성하고, 생성한 디렉터리로 이동한다
-p 옵션은 부모 디렉터리가 없는 경우에도 생성하도록 한다
그런 다음 testweb1이라는 컨테이너의 파일 시스템을 testweb1.tar로 내보낸다
현재 디렉터리 파일 목록을 확인하고, testweb1.tar 파일 유형도 확인한다
testweb1.tar 파일 내의 내용을 나열하고,
한 화면씩 보기 위해 more을 사용하여 페이지로 나누어 표시했다
● ● ● ● ● ●
이 아래로는 제가 작성한 내용이 모두 날아가서
강사님의 교재로 대체하겠습니다
4. tar 파일을 이용하여 이미지 생성
1) 명령어 형식
# docker import [옵션] 파일 - 이미지_이름:태그
# docker import [옵션] URL - 이미지_이름:태그
# docker image import 파일 - 이미지_이름:태그
# docker image import URL - 이미지_이름:태그
2) 명령어 사용 예시
① 아카이브/압축 파일을 이용하여 이미지 생성하기 I
# docker image import image.taz.gz
② 아카이브/압축 파일을 이용하여 이미지 생성하기 II
# cat image.taz.gz | docker image import - kim10322/testweb4:1.0
③ 원격 아키이브/압축 파일을 이용하여 이미지 생성하기
# docker image import https://github.com/ncs10322/kube/raw/main/image.tar.gz
3) tar 파일을 이용하여 이미지 생성 예제
5. 이미지를 tar 이미지 파일로 저장
1) 명령어 형식
# docker save [옵션] 이미지_이름
# docker image save [옵션] 이미지_이름
2) 명령어 사용 예시
# docker pull ubuntu
# docker image save -o image.tar ubuntu
3) 이미지를 tar 이미지 파일로 저장 예제
6. tar 이미지 파일을 이용하여 이미지 생성
1) 명령어 형식
# docker load [옵션]
# docker image load [옵션]
2) 옵션
-i, --input string
3) 명령어 사용 예시
# docker image load -i image.tar
4) tar 이미지 파일을 이용하여 이미지 생성 예제
13. Docker 파일 이미지 빌드
1. Dockerfile 파일을 이용한 이미지 생성
1) Dockerfile 들어갈 주요 내용
2) Dockerfile 예제
3) Dockerile 기본 구문
4) Dockerfile 주석
Dockerfile 에 주석을 사용하는 경우, 라인 맨 앞에 #을 붙인다
5) Dockerfile 베이스 이미지 설정
2. Dockerfile을 이용한 Docker 이미지 생성
1) 명령어 형식
# docker build [옵션] 경로
# docker build [옵션] URL
# docker image build [옵션] 경로
# docker image build [옵션] URL
2) 명령어 사용 예시
① 현재 디렉토리에 있는 Dockerfile 파일을 이용하여 빌드 및 buildtest 이미지 생성
# docker image build -t buildtest .
② /home/user1/build/Dockerfile 파일을 이용하여 빌드 및 buildtest 이미지 생성
# docker image build -t buildtest /home/user1/build/
③ 현재 디렉토리에 있는 Dockerfile1 파일을 이용하여 빌드 및 buildtest 이미지 생성
# docker image build -t buildtest . -f Dockerfile1
④ /home/user1/build/Dockerfile1 파일을 이용하여 빌드 및 buildtest 이미지 생성
# docker image build -t buildtest -f /home/user1/build/Dockerfile1
3) Dockerfile을 이용한 Docker 베이스 이미지 만들기
3. Docker 이미지 레이어 구조
1) Dockerfile 생성
# 베이스 이미지
FROM ubuntu:latest
# nginx 설치
RUN apt-get update && apt-get -y install nginx
# 파일 복사(/var/www/html/는 ubuntu 이미지에 nginx 루트 디렉토리)
COPY ./index.html /var/www/html/
# nginx 시작
CMD ["nginx", "-g", "daemon off;"]
2) 'index.html' 파일 생성
3) tar 파일 생성
4) 이미지 빌드 하기
4. 멀티스테이지 빌드를 이용한 이미지 용량 줄이기
1) 싱글 스테이지를 사용하는 경우
package main
import "fmt"
func main() {
fmt.Println("Hello Docker")
}
# 이미지 적용
FROM golang:1.16
# 의존성 모듈 설치
WORKDIR /go/src/github.com/test/hello
RUN go get -d -v github.com/urfave/cli
# 빌드
COPY main.go main.go
RUN GOOS=linux go build -a -o hello main.go
# 실행
ENTRYPOINT ["./hello"]
2) 멀티 스테이지를 사용하는 경우
# 개발 환경 이미지(AS는 별칭을 지정함)
FROM golang:1.16 AS builder
# 디렉토리 이동 및 의존성 모듈 설치
WORKDIR /go/src/github.com/test/hello
RUN go get -d -v github.com/urfave/cli
# 'main.go' 소스 코드 복사 및 'hello' 애플리케이션 빌드
COPY main.go main.go
RUN GOOS=linux go build -a -o hello main.go
# ------------------------------
# 제품 환경 이미지
FROM busybox
WORKDIR /opt/greet/bin
# 개발 환경에서 제작한 'hello' 애플리케이션을 제품 환경으로 복사(--from으로 가져올 지점을 지정함)
COPY --from=builder /go/src/github.com/test/hello/ .
# 실행
ENTRYPOINT ["./hello"]
5. 명령 및 데몬 실행
Dockerfile 작성 참고 사이트 : https://docs.docker.com/develop/develop-images/dockerfile_best-practices
1) RUN
ex) RUN 명령 예제
2) CMD & ENTRYPOINT
Ex1) RUN 명령 예제
Ex2) ENTRYPOINT/CMD 명령으로 top 명령 실행 예제
3) ONBUILD
강의 소감
오늘은 네트워크 관리와 컨테이너 운용,
리소스 제한 및 모니터링과 더불어 이미지 생성도 시도하고
파일 이미지를 빌드 하는 실습을 진행했다
해당 실습을 진행하면서 현재 이 블로그에 적었던 내용이
반 이상 날아갔지만 오히려 이걸 기회로 삼아 복습하면서 공부하는 계기가 됐다
앞으로도 내 블로그를 보면서 열심히 노력하고
계속 성장하는 사람이 되고 싶다
출처 - 코리아it아카데미 김정우 강사님 제공
*중간에 나오는 교재의 단편적인 면이 아닌
MobaXterm으로 실행하여 캡처한 것은 모두 본인이 직접 실행해 보고
캡처하여 블로그에 작성하는 것입니다
'멀티 클라우드 인프라(DKR & K8S)' 카테고리의 다른 글
도커 & 쿠버네티스 6 (2) | 2024.11.11 |
---|---|
도커 & 쿠버네티스 5 (0) | 2024.11.02 |
도커 & 쿠버네티스 4 (0) | 2024.10.28 |
도커 & 쿠버네티스 2 (2) | 2024.10.20 |
도커 & 쿠버네티스 1 (1) | 2024.10.20 |