Docker image tag는 image에 tag를 붙여 다른 이름으로 사용하는 것을 의미한다. 이미지들끼리 이름이 같은 경우가 있기 때문에 tag를 통해 구분해야 한다.
docker tag httpd:latest httpd:duck (tag 바꿔서 httpd 이미지를 copy한다.)
이미지를 copy해서 생성되었음을 확인할 수 있다. 다만 image id도 서로 같다.
Docker rmi httpd:latest (Httpd:latest를 지워보겠다.)
Layer가 삭제되지 않고 untagged만 진행되었음을 확인할 수 있다.
그 이유는 Docker의 image는 여러 개의 읽기 전용 layer로 구성된다. Container 생성시 RW가 가능containter layer가 따로 생성된다. 하나의 image로 여러 개의 container가 구성되고 사용이 가능해진다. 변경사항은 Container Layer에 저장하고 Read시 image와 Container Layer 조합이다. 그림에서와 같이 한 이미지에 여러 개의 container로 구성된다. 원본, 사본 상관없이 마지막에 지워지는게 layer가 지워지게 된다. duck이란 tag의 httpd를 지워보겠다. untagged됨과 동시에 layer도 삭제됨을 확인할 수 있다.
Docker container 실행 중 host로 이동과 exec 명령어 사용!
Docker에 alpine(리눅스 껍데기만 지원)와 centos 이미지를 다운받겠다.
Centos 이미지를 활용하여서 a1이라는 container를 만들고 실행하겠다. (-it 옵션)
Docker start시키고 docker ps로 실행되는 container 확인한다.
Docker attach a1 (a1 container로 접근한다.) 쉘이 바뀌었음을 확인할 수 있다.
잘 접근하였나 확인하기 위해 ls 명령어를 입력해보았다.
Exit로 host로 나왔다. 여기서 문제점이 생긴다. Exit로 나오게 되면 container가 중단된다. Docker ps로 바로 확인해 본 결과 실행 중인 container가 중단되었음을 확인할 수 있다.
다시 a1으로 접근한 후 (ctrl + p + q)로 host로 나오게 되면 docker ps로 확인해 본 결과 container가 중단되지 않았음을 확인할 수 있다. Container를 중단하지 않고 host로 나오고 싶다면 ctrl + p +q키를 사용하여야 한다.
Exec명령어는 특정한 container에 일일이 들어가지 않고 명령어를 실행한 후 출력 값을 host에서 볼 수 있게 해주는 명령어이다. 위에서 만든 a1 container를 사용하겠다.
Docker exec –it a1 ping 168.126.63.1
(콘솔제공과 상호작용을 하며 a1에서 ping 168.126.63.1 명령어를 실행하겠다.)
exec명령어를 사용해 ls, pwd, ps 명령어를 실행해 보았다. 이처럼 여러가지 명령어를 굳이 container로 이동하지 않아도 exec를 통해서 쓸 수 있다.
Docker의 네트워크 설정과 link에 대해 알아보겠다.
Docker network list (도커의 network 정보 확인!)
container들은 생성될 때 기본적으로 bridge드라이버를 사용한다.
Docker inspect bridge( bridge에 자세히 보겠다.) 172.17.0.0대역을 사용함을 확인!
Centos 이미지를 사용해서 b1컨테이너를 만들고 실행하겠다.
Docker run –it –name b1 centos
Ifconfig 명령어를 쓰기 위해 net-tools를 다운받겠다.
Ifconfig를 확인해 본 결과 bridge드라이버의 172.17.0.0/24대역을 사용함을 확인할 수 있다. 172.17.0.2인 경우는 172.17.0.1인 게이트웨이 주소를 제외하고 다음 ip이다.
만약 자신이 만든 특별한 ip 대역을 가지고 싶으면 어떻게 해야 할까? Network를 생성하면 된다. Network create 명령어를 통해 새로운 network를 생성하면 된다.
docker network create --subnet 192.168.100.0/24 --gateway 192.168.100.254 test
(192.168.100.0대역의 192.168.100.254의 gateway를 갖는 네트워크 test 생성!)
Network카드를 부여하는 방법에는 2가지가 있다. 기존에 있던 container에 부여하는 방법과 새로 생성할 때 부여하는 방법이다. 먼저 기존에 있던 container b1에 부여해보겠다.
docker network disconnect bridge b1 (b1의 bridge 네트워크 해체)
docker network connect test b1 (b1 test 네트워크 연결)
Docker b1을 시작한 뒤 attach 명령어로 접근하겠다.
Docker start b1, docker attach b1
Ifconfig로 확인 해본 결과 ip가 바뀌었음을 확인할 수 있다.
새로 생성하고 실행하는 container에 네트워크를 부여하는 방법은 –net 옵션을 추가한다.
docker run -it --net test --name b2 centos
(test라는 네트워크와 centos 이미지를 사용하여 b2라는 컨테이너 만들고 실행하겠다.)
Ifconfig명령어 확인을 위해 net-tools를 설치하겠다. (yum install –y net-tools)
ifconfig명령어 입력하면 192.168.100.1을 사용하는 b1때문에 192.168.100.2 ip를 받아온다.
Container link란 컨테이너는 ip를 동적으로 받아오기 때문에 항상 동일한 ip를 사용한다는 보장이 없다. 서로 다른 두개 이상의 컨테이너 통신에서 문제가 생긴다. 컨테이너 링크는 컨테이너의 ip가 변경되어도 통신이 유지되도록하는 기능이다. 컨테이너 내부에 있는 /etc/hosts파일에 기록된다. B1 alpine container를 만들고 b3를 b1쪽으로 link를 걸어서 생성해보겠다.
Docker run –itd –name b1 alpine (b1 container 생성 후 실행)
docker run -itd --name b3 --link b1 alpine
(b1과 link된 alpine이미지를 사용하는 b3 컨테이너 생성)
b3 container에 접근한 뒤 ping b1을 실행하여 보겠다. Ping이 잘 간다.
Cat 명령어를 통해 /etc/hosts를 확인해 보면 b1이 등록되어 있음을 확인할 수 있다.
Docker의 host디렉토리 공유와 볼륨공유에 대해 알아보겠다.
/test라는 디렉토리를 만들고 duck.txt.에 duck world을 입력하였다.
docker run -itd -v /root/test:/root --name a1 alpine
(local의 /root/test을 a1의 /root로 공유하겠다)
a1에 접근 후에 cd root로 이동하겠다.
Ls 명령어로 확인해보는 결과 duck.txt가 존재함을 확인할 수 있다.
Test, test1, test2 디렉토리를 만들고 각각 txt파일을 넣어주었다.
echo "duck world" > test/duck.txt
echo "duck world" > test1/duck1.txt
echo "duck world" > test2/duck2.txt
docker run -itd -v /root/test/:/test -v /root/test1:/test1 -v /root/test2/:/test2 --name a1 alpine (a1에 디렉토리가 존재하지 않으면 디렉토리도 저절로 생성되고 파일도 공유된다.)
a1컨테이너에 접근한 뒤 디렉토리 이동 후 확인하면 디렉토리의 존재를 확인할 수 있다.
각각의 디렉토리에 알맞게 파일이 존재함을 확인할 수 있다.
Docker volume을 생성하여 container과 공유하겠다.(도커 볼륨 : 컨테이너 디렉토리)
Docker volume create duck (duck이라는 volume을 생성한다.)
Docker volume ls (volume list 확인!)
볼륨은 /var/lib/dock/volumes의 경로에 생겨난다. (볼륨을 확인할 수 있다.)
docker run -it -v duck:/duck --name a2 alpine
(생성한 볼륨 duck을 컨테이너 디렉토리 /duck에 공유하겠다.)
ls명령어를 통해 duck 디렉토리 확인 가능하다.
a.txt라는 파일을 만들고 컨테이너 중지시키지 않고 (ctrl + p +q)로 나오겠다.
Cat var/lib/docker/volumes/duck/_data/a.txt를 통해 볼륨을 확인할 수 있다.
(_data에 a.txt가 생겨남에 따라 volume이 공유되었음을 확인이 가능하다.)
Docker container의 환경 변수에 대해 알아보겠다.
docker run -it -e a=100 --name a1 alpine
(a1 container을 만드는데 a=100이라는 값을 삽입시키겠다.)
Echo명령어를 통해 컨테이너 생성과 실행과 동시에 a값이 삽입되었음을 확인할 수 있다.
이런 환경변수의 속성을 이용하여 DB환경에 접속하여 보겠다.
Docker pull mysql (먼저 mysql 이미지를 받아 오겠다.)
Mysql 이미지를 이용하여 sql1이라는 컨테이너를 생성하여 보겠다.
Docker run –it –name sql1 mysql , root의 비밀번호가 존재하지 않는다고 나온다.
docker run -d -e MYSQL_ROOT_PASSWORD=It1 -p 3306:3306 --name sql2 mysql --default-authentication-plugin=mysql_native_password (환경변수 옵션을 이용해 root password를 It1로 삽입하여서 sql2 도커를 실행하겠다.) <- 백그라운드로
컨테이너의 세부정보를 확인하기 위해 inspect 명령어 실행한다. Docker inspect sql2
Mysql 접속을 위해 생성한 컨테이너의 ip정보를 알아야 한다. Inspect 명령어를 통해 엄청나게 많은 정보들이 나온다. Network 부분에서 ip address부분을 확인하면 된다. 확인 해본 결과 172.17.0.4의 ip를 가짐을 확인할 수 있다.
mysql -uroot -pIt1 -h 172.17.0.4 (root계정 비밀번호 입력 –h 옵션 ip 입력)
Docker container에 mysql DB환경을 구성하였다.
'기타 > Docker, K8S' 카테고리의 다른 글
K8S kubeadm 구축 (1) | 2023.09.19 |
---|---|
kubernetes란? (0) | 2019.10.20 |
docker 정의 및 Web Server container 실행 (0) | 2019.08.20 |