0. 도커 개념
- OS 수준의 가상화
- VM(하이퍼바이저) 보다 Layer가 높다
- 컨테이너는 VM과 역할이 유사함; 구획을 만들고 , 애플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용함
- 도커는 이미지와 컨테이너로 나누어서 구성된다.
- 여러 도커 컨테이너가 호스트 OS를 공유한다. -> 오버헤드(프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간,메모리,자원이 사용되는 현상)가 적다(컨테이너 자체에는 OS가 없기 때문에)
- OS를 대신하여 Base Image가 존재한다.
- OS의 이름을 활용하여 base image가 있지만, 일반적인 OS가 아니다.
- base image는 AMI와 유사
- AMI를 실행시켜 VM을 만드는 것처럼 이미지를 활용하여 컨테이너를 만든다.
- layer 하나가 더 있다는 것은 오버헤드가 발생할 가능성이 더 많을 수 있음을 의미
- doker를 설치하면 client와 Doker_host가 생긴다.
- client가 명령어를 통해서 doekr_host를 컨트롤한다.
- 이를 통해 client는 이미지와 컨테이너를 만들 수 있다.
- vbox, VMware의 역할을 하는 Doker daemon도 자동으로 생긴다.
- Registry(저장소); doker hub에 이미지를 올려서 또 다른 누군가가 그것을 내려받아 컨테이너로 옮겨서 구동 가능.
- 도커는 운영체제가 없고 바로 실행파일을 활용(yum, apt 등)
- 컨테이너는 web, DB 같은 애플리케이션을 나타낸다.
- 컨테이너는 애플리케이션 수준 구성이며 커널 하나(호스트 OS)를 공유하는 여러 환경을 에뮬레이션한다.
- 가상화 기술이 컨테이너 기술과 비교해서 layer가 한층 더 많기 때문에 성능이 떨어질 수도 있음
- doker start 명령을 입려하면 컨테이너 위에 실행시킬 프로세스가 올라간다.
1. 도커 실습
* 실습전 vbox 가상환경의 ip가 이전에 생성했던 가상환경과 같은 오류가 있었다.
* 이전에 VM을 스냅샷으로 만들었기 때문에 ova 파일을 그대로 가져오면 맥주소가 같아진다.
* 도커 vbox의 네트워크의 고급 항목에서 맥주소를 새로고침하여 변경하였다
- 시간이 틀어지는 경우가 있기 때문에 rdate를 활용하여 현재 지역의 시간으로 맞춘다.
1.1 센토스 도커 설치
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 # 설치한 초기에만 enable 명령어를 사용한다. 운영중 x, 운영중에는 restart, start 사용
- 도커 설치 명령어 입력
1.2 도커 기본 명령어
# 도커 이미지 다운로드
# docker search nginx //nginx 이미지 검색
# docker image pull nginx //nginx 이미지 가져오기
# docker image ls
# docker image ls -q //이미지만
# docker image inspect --format="{{ .Os}}" nginx // key value 이용하여 검색(필터링); nginx의 OS 확인
# docker container create -p 80:80 --name webserver nginx
// 포트포워드 왼쪽(호스트):오른쪽(컨테이너)
// -p; publish
// --name; 컨테이너에 이름 주기
[root@localhost ~]# docker container ls -a
// created 상태인 container의 정보 보려면 '-a'붙여야함.
// 아직 실행되지 않았기 때문에 -a를 누락하면 정보 안보임.
# docker container start webserver
[root@localhost ~]# docker container ls
# run으로 건테이너 웹서버 생성
# docker container stop webserver
# docker container ls -a //서버 멈추면(exited) ls만 하면 안나옴. -a 꼭 붙여야함.
# docker container start webserver
# docker container rm -f webserver // 실행중인 컨테이너는 -f 붙여서 지워야함.
# docker container run -p 80:80 --name webserver nginx
//create + start -> host IP로 접근 가능
//foreground실행이라 이거 하면서 다른 거못함. 컨트롤 씨로 나올 수 있는데, 그러면 서버 중지됨.
# docker container rm webserver //지웠다가 background로 다시만들기.
# docker container run -d -p 80:80 --name webserver nginx
// -d ; background 실행
//실행과 동시에 다른거 할 수 있음.
# 서버 생성 충돌나는 경우
# docker container run -d -p 81:80 --name webserver nginx // 이름 충돌 - 생성 안됨 . 만들어지지 않음.
# docker container run -d -p 81:80 --name webserver2 nginx //정상 생성
# docker container run -d -p 81:80 --name webserver3 nginx
// 포트번호 충돌- 오류났지만 컨테이너는 만들어짐. (멈추어져 있는 상태)
# docker container run -d -p 82:80 --name webserver3 nginx // 위에서 오류났지만 만들어져있기 때문에 이름 충돌로 만들어지지 않음.
# docker container rm -f webserver3 //삭제
# docker container run -d -p 82:80 --name webserver3 nginx //다시 포트번호와 이름 중복되지 않게만들면 완료.
# docker container ls -a
# /bin/cal 캘린더 사용
[root@localhost ~]# /bin/cal
July 2022
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
// 도커 호스트 서버에서 /bin/cal 실행.
# docker container run --name test_cal centos /bin/cal
//centos이미지 이용해서 /bin/cal 이용(명령어 or 애플리케이션)해서 output 할 수 있는 컨테이너 제작
//아주 일시적이고 한시적인 컨테이너 제작. /bin/cal 기능 잠시 수행하고 멈출 것.
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
July 2022
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
// 도커 호스트에서 만든 컨테이너(centos)에서 명령어 이용해서 캘린더 출력.
# 컨테이너 생성하고 내부로 바로 진입
# docker container run -it --name test_bash centos /bin/bash
// -it 컨테이너에 바로 진입(터미널)하는 옵션 (ssh reomote 접속이랑 비슷)
exit
# 백그라운드 실행; -d 중요
# docker container run -d --name test_ping centos /bin/ping localhost //-d ;detattch, background 실행
[root@localhost ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6fcf9bd99a8a centos "/bin/ping localhost" About a minute ago Up About a minute test_ping
// -a 없이 확인 가능.
# docker container logs -t test_ping
// ping 나가는거 실시간으로 확인. 백그라운드에서 일어나는 로그나 상태를 확인하는 명령어
# 컨테이너 리소스 지정
# docker container run -d -p 8080:80 --name test_port nginx
//마지막 nginx이름은 이미지 이름.
# docker container stats test_port
//cpu,ram상태보기
# docker container run -d -p 8181:80 --cpus 1 --memory=256m --name test_resource nginx // CPU,RAM 지정해서 컨테이너 생성. 호스트를 초과하는 자원을 정하면 에러가 남. 지정하지 않으면 호스트가 가지고 있는 모든 자원을 이용할 수 있게 함.
# 컨테이너 디렉토리 공유; '-v' 중요!!
# docker container run -d -p 8282:80 --cpus 1 --memory=256m -v /tmp:/usr/share/nginx/html --name volume-container nginx
//-v; bind mount
[root@localhost ~]# cd /tmp
[root@localhost tmp]# ls
ks-script-fkKyI6 yum.log
[root@localhost tmp]# echo "hello world" > index.html
[root@localhost tmp]# ls
index.html ks-script-fkKyI6 yum.log
-> tmp와 nginx html 폴더가 연결되어 있어 바로 웹서버 파일 바꿔줄 수 있음.
# 컨테이너 목록 확인하기 + 필터링 검색
# docker container ls
# docker container ls -a
# docker container ls -a -f name=test_webserver // 이름으로 검색하기
# docker container ls -a -f name=test_ // 중간어 검색도 됨.
# docker container ls -a -f exited=0 // 멈춰(중지)있는 것들만 보기
# docker container ls -a --format "table {{.Names}}\t{{.Status}}" //이름이랑 상태만 보기
# 동작중인 컨테이너 연결
# docker container start test_bash
# docker container attach test_bash
[root@1689b6318c35 /]# ctrl + p, ctrl +q 를 입력
# docker container ls
//exit로 나오면 컨테이너가 exited상태가 됨 (다운) 위 키보드 키로 누르고 나오면 실행 된 상태에서 도커호스트로 나오기 가능.
# 동작중인 컨테이너에서 프로세스 실행
# docker contianer exec [옵션]<컨테이너><실행명령>[인수]
# docker container exec -it test_port /bin/echo "Hello world"
//컨테이너 안으로 들어가서 echo이용해서 hello world 출력
# docker container exec -it test_port /bin/bash
//exit로 나와도 컨테이너 exited 되지 않음.
// 경로 /bin/bash 인게 중요. 이 명령어기 때문에 내부로 들어갈 수 있음.
//만약 /bin/cal 이었으면 캘린더만 출력해주고 끝.
//요 라인은 통으로 기억하자!
#응용 /bin/bash로 웹서버 화면 바꾸기
[root@localhost ~]# docker container exec -it webserver /bin/bash
root@2ac073800eed:/#
root@2ac073800eed:/# cd /usr/share/nginx/html
root@2ac073800eed:/usr/share/nginx/html# ls
50x.html index.html
root@2ac073800eed:/usr/share/nginx/html#
root@2ac073800eed:/usr/share/nginx/html# echo "aloha" > index.html
# 동작중인 컨테이너 프로세스 확인
# docker container top test_port // 컨테이너에 실행중이 프로세스들 확인
# 컨테이너 이름 바꾸기
# docker container rename test_port webserver10
# 컨테이너 안의 파일 복사
# docker container cp webserver:/usr/share/nginx/html/index.html /root/index.html
// 왼쪽 컨테이너 경로 에서 오른쪽 호스트 경로로 가져오기
[root@localhost ~]# cd ~
[root@localhost ~]# ls
anaconda-ks.cfg index.html
[root@localhost ~]# vi index.html
aloha
Ohayo
# docker container cp ./index.html webserver:/usr/share/nginx/html/index.html
->결과 확인
# 컨테이너 안의 파일 복사 2
aws.tar파일 도커호스트 서버의 home디렉토리에 모바엑스텀으로 넣어두기.
[root@localhost ~]# mkdir html
[root@localhost ~]# tar -xvf aws.tar -C ./html/
[root@localhost ~]# docker container cp ./html webserver:/usr/share/nginx
-> 결과
# 컨테이너와 원본 이미지의 차이점 확인
# docker container diff webserver //변경사항 확인. 보안적인 측면.
# 컨테이너를 이미지로 만들기 (스냅샷같은 느낌)
# docker container commit -a "johnlee<test@example.com>" -m "NICE TO MEET YOU" webserver test_commit:v1.0
//-a; author. 작성자 이름 -> 선택사항
//-m ; message. -> 선택사항
//webserver 컨테이너 이름
// test_commit 이미지 이름
// :v1.0 태그
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test_commit v1.0 092d1ba32297 13 seconds ago 143MB
# 위에서 만든 이미지 받을 서버 만들기
우분투 18 실행 ( ubuntu-node01) 후 모바엑스텀 진입하여 아래 명령어 진행. ( 우분투 도커 설치 )
$ apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
$ 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"
$ sudo apt update
$ sudo apt-cache policy docker-ce
$ sudo apt install docker-ce -y
# 이미지 tar 파일로 만들어서 보내기
# docker image inspect test_commit:v1.0
# docker image save -o test_commit.tar test_commit:v1.0
//이미지 보내기 위해 타르파일로 만들기. 이미지 이름이 맨 뒤에 옴.
[root@localhost ~]# ls
anaconda-ks.cfg aws.tar html index.html test_commit.tar
[root@localhost ~]# scp test_commit.tar root@192.168.1.46:/root
# 이미지 받아서 컨테이너 만들어보기
root@ubuntu-node01:~# ls
nfs test_commit.tar
root@ubuntu-node01:~# docker image load -i test_commit.tar
root@ubuntu-node01:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test_commit v1.0 092d1ba32297 21 minutes ago 143MB
root@ubuntu-node01:~# docker container run -d -p 80:80 --name webserver test_commit:v1.0
->결과 확인
# docker network ls
# docker network ls -q --filter driver=bridge
# docker network create -d bridge --subnet 192.168.123.0/24 --ip-range 192.168.123.0/24 test_bridge
# docker network rm test_bridge
# docker network connect test_bridge webserver
# docker container inspect webserver
# docker network disconnect test_bridge webserver
# docker container run -d --name webserver1 --network test_bridge -p 8080:80 nginx
# docker network inspect test_bridge
기타
- docker inspect 검색하는 방법
하윗단 검색하려면 겹 중괄호 안에 .~(최상위).@(하위) 넣어서 검색.
그랩 명령어도 사용 가능.
- docker status
실행중(up) - 프로세스에 올라갔다.
CPU, 메모리, 디스크 자원을 점유.
컨테이너는 일종의 프로세스.
프로세스에 올라가기 전에는 정적인 상태로 남아있어서 ls 명령어 주면 안나옴. 실행 시켜야 나온다.
도커웹서버와 포트포워드
도커에 사용자가 접근하려면 도커 호스트 ip로(1개) 접근해야함. 그래서 여러 서버가 있는 경우 포트포워드를 해줘야함.
- run
이미지 가져오기
container create
container 실행
위 기능을 모두 가지고 있음. ; pull 필요가 없다.
- container 이름 설정 안하고 run 실행시 이름 임의로 부여됨.
[root@localhost ~]# docker container run centos /bin/cal
[root@localhost ~]# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e8ee6cd6a6a centos "/bin/cal" 21 seconds ago Exited (0) 20 seconds ago happy_ellis
'Cloud Solution Architect > 컨테이너' 카테고리의 다른 글
docker2 (0) | 2023.05.26 |
---|