티스토리 뷰
image 파일로 만들기
▶ apache container 의 계열 확인
Redhat : cat / etc / redhat-release
Devian cat / etc / issue
▷ useradd admin 만들어도 바로 홈 디렉터리에 만들어지지는 않는다 / home / admin 이 없다
>> useradd -m admin : / home / admin 디렉터리를 생성하는 옵션
root@ca977e46c872:/usr/local/apache2/htdocs# useradd -m admin
▷ apt 업데이트로 패키지를 다운로드 한다
>> update 하지 않으면, repo가 존재하지 않는다
root@ca977e46c872:/usr/local/apache2# apt update
▷ net-tools 다운로드
root@ca977e46c872:/usr/local/apache2/htdocs# apt install net-tools -y
▷ 원격 접속 했을 시 공격을 받을 가능성이 있으므로, 보안상 좋지 않다 ( 삭제한다 )
>> telnet 접속하면 보인다
root@ca977e46c872:/usr/local/apache2/htdocs# rm /etc/motd
root@ca977e46c872:/usr/local/apache2/htdocs# rm /etc/issue.net
▶ 패키지를 다운로드 했는데, Host 에서 컨테이너를 지우면 사라진다
>> 이전에 배웠던 방법은 - - volume 옵션을 붙이는 방법인데 이 방법은 불가능하다
>> 패키지를 다운로드 했으므로, 패키지는 한 두군데에 영향을 미치는게 아니다
# diff 명령어 >> 두 디렉터리의 차이를 보여준다
[vagrant@docker1 work]$ diff /etc/issue /etc/motd
1,3d0
< \S
< Kernel \r on an \m
<
▷바뀌었거나 / 수정된 부분을 알려준다
>> A : add
>> C : change
>> D : delete
[vagrant@docker1 work]$ docker diff apache
▶ 실행중인 컨테이너를 이미지로 만든다
docker container commit [옵션] 컨테이너 식별자 컨테이너 이름 [이미지[:태그명]]
[vagrant@docker1 work]$ docker container commit -a "loo<kildong@naver.com" apache custom_httpd:1.0
sha256:3349923d0370bf6e77119bdea4f54782b08bc38ac18539d58ed9b69a8a23d12e
[vagrant@docker1 work]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
custom_httpd 1.0 3349923d0370 54 seconds ago 189MB
mariadb latest b8bba28b797b 12 days ago 405MB
nginx latest e4720093a3c1 2 weeks ago 187MB
alpine latest 05455a08881e 5 weeks ago 7.38MB
mysql latest a88c3e85e887 6 weeks ago 632MB
httpd 2.4 2776f4da9d55 6 weeks ago 167MB
httpd latest 2776f4da9d55 6 weeks ago 167MB
ubuntu 18.04 f9a80a55f492 9 months ago 63.2MB
hello-world latest d2c94e258dcb 10 months ago 13.3kB
centos 8 5d0da3dc9764 2 years ago 231MB
▷ 삭제하고 확인
>> 미리 만들어둔 / home / admin 이 그대로 존재
# TAG 1.0 을 붙여줘야 컨테이너가 실행된다
[vagrant@docker1 work]$ docker run -d --name cus1 custom_httpd:1.0
f17013d74841d682477bf5ea783b251198d8647e08358056e5fd223c1860b9bd
[vagrant@docker1 work]$ docker exec -it cus1 /bin/bash
root@f17013d74841:/usr/local/apache2# ls /home
admin home
tar 아카이브로 만들기
▶ 사전작업
# tab 하면 하나밖에 없는 컨테이너 이므로 나타난다
[vagrant@docker1 work]$ docker run -d httpd:2.4
5923e9b7666cb492a54cefc6573388add43acd8ac699349284e2c2b2a5646a89
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5923e9b7666c httpd:2.4 "httpd-foreground" 3 seconds ago Up 2 seconds 80/tcp xenodochial_northcutt
[vagrant@docker1 work]$ docker exec -it xenodochial_northcutt /bin/bash
root@5923e9b7666c:/usr/local/apache2#
root@5923e9b7666c:/usr/local/apache2# useradd -m admin
root@5923e9b7666c:/usr/local/apache2# rm /etc/issue.net
● tar 생성
[vagrant@docker1 work]$ docker container export xenodochial_northcutt > httpd.tar
▷ httpd.tar 에 존재한다
[vagrant@docker1 work]$ tar -tf httpd.tar | grep admin
home/admin/
home/admin/.bash_logout
home/admin/.bashrc
home/admin/.profile
▶ 백업과 같은 맥락이나, httpd.tar 를 푼다고 해서 image 로 쓸 수 있는 건 아니다
# | 로 넘어온 값을 - 로 대체한다
[vagrant@docker1 work]$ cat httpd.tar | docker image import - myhttpd:1.0
[vagrant@docker1 work]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myhttpd 1.0 03b5b4bdef98 4 seconds ago 166MB
custom_httpd 1.0 3349923d0370 24 minutes ago 189MB
▩ 도커 이미지가 실행이 되지 않는다
>> 컨테이너는 올라갈 때에는 항상 커맨드가 필요하다
▷ sleep 실행으로 커맨드가 들어가면 바로 실행이 된다
[vagrant@docker1 work]$ docker run -d --name cus1 myhttpd:1.0 /bin/sleep 300
9672fccbe35dd76331370bc150c159086d0e51e9bbc2aa63c77d5f0f3464a946
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9672fccbe35d myhttpd:1.0 "/bin/sleep 300" 7 seconds ago Up 6 seconds cus1
5923e9b7666c httpd:2.4 "httpd-foreground" 23 minutes ago Up 23 minutes 80/tcp xenodochial_northcutt
● 원래 아파치는 무슨 커맨드를 실행하는지 확인해보기
>> 커맨드를 올리면, httpd-foreground 를 실행하고 있다
[vagrant@docker1 work]$ docker run -d --name cus2 httpd:2.4
750e59cd384b51453b2a0c0e2f6dc66263487ceac655f037e8198bb335a9f6a9
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
750e59cd384b httpd:2.4 "httpd-foreground" 18 seconds ago Up 17 seconds 80/tcp cus2
9672fccbe35d myhttpd:1.0 "/bin/sleep 300" About a minute ago Up About a minute cus1
5923e9b7666c httpd:2.4 "httpd-foreground" 24 minutes ago Up 24 minutes 80/tcp xenodochial_northcutt
▷ httpd-foreground 로 실행해보자
[vagrant@docker1 work]$ docker run -d --name cus2 myhttpd:1.0 httpd-foreground
▩ 실행해도 안올라온다
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9672fccbe35d myhttpd:1.0 "/bin/sleep 300" 3 minutes ago Up 3 minutes cus1
5923e9b7666c httpd:2.4 "httpd-foreground" 26 minutes ago Up 26 minutes 80/tcp xenodochial_northcutt
▷ httpd-foreground 를 찾았다
>> rm -f /usr/local/apache2/logs/httpd.pid 삭제해야 시스템이 아피치가 올라왔는지 아닌지를 확인한다??
>> exec httpd -DFOREGROUND "$@" 가 출력된다
root@5923e9b7666c:/usr/local/bin# find / -name httpd-foreground
find: '/proc/1/map_files': Operation not permitted
find: '/proc/8/map_files': Operation not permitted
find: '/proc/9/map_files': Operation not permitted
find: '/proc/10/map_files': Operation not permitted
find: '/proc/106/map_files': Operation not permitted
find: '/proc/113/map_files': Operation not permitted
/usr/local/bin/httpd-foreground
root@5923e9b7666c:/usr/local/apache2# cd /usr/local/bin/
root@5923e9b7666c:/usr/local/bin# cat httpd-foreground
#!/bin/sh
set -e
# Apache gets grumpy about PID files pre-existing
rm -f /usr/local/apache2/logs/httpd.pid
exec httpd -DFOREGROUND "$@"
▷PATH 에는 httpd 가 잡혀있는데 우리가 실행할 때에는 잡히지 않는다
>> 직접 실행할때 저 PATH로 잡아준다
root@5923e9b7666c:/usr/local/bin# echo $PATH
/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
root@5923e9b7666c:/usr/local/bin# find / -name httpd
find: '/proc/1/map_files': Operation not permitted
find: '/proc/8/map_files': Operation not permitted
find: '/proc/9/map_files': Operation not permitted
find: '/proc/10/map_files': Operation not permitted
find: '/proc/106/map_files': Operation not permitted
find: '/proc/114/map_files': Operation not permitted
/usr/local/apache2/bin/httpd
▶ 직접 경로로 잡아준다
# 위에 나온 exec httpd -DFOREGROUND "$@" 에서 exec 는 실행의 의미이므로 뺀다
[vagrant@docker1 work]$ docker run -d --name cus4 myhttpd:1.0 /usr/local/apache2/bin/httpd -DFOREGROUND
f2f8ee44a41c36b0a5fbbc6bbe92820c2a7d10d012a9d8a5e4e4a82e16a7b6da
>> cus4 가 올라왔다
[vagrant@docker1 work]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2f8ee44a41c myhttpd:1.0 "/usr/local/apache2/…" 3 seconds ago Up 2 seconds cus4
5923e9b7666c httpd:2.4 "httpd-foreground" 33 minutes ago Up 33 minutes 80/tcp xenodochial_northcutt
◎ 위의 방식은 굉장히 불편하고 복잡하므로 잘 사용 안한다
# 장비 2개로 확인해야한다
# Ubuntu 장비도 docker 사용 가능하도록 그룹에 넣는다 >> 이후에 새로 로그인
vagrant@docker2:~$ sudo usermod -aG docker vagrant
vagrant@docker2:~$ groups
vagrant docker
▷ 실습 전 Ubuntu 의 모든 이미지와 컨테이너 삭제
# - f 강제 삭제 가능하다
# rmi 는 이미지 삭제
vagrant@docker2:~$ docker rm $(docker ps -aq)
69ae4110b2b6
63d6623ea9f5
vagrant@docker2:~$ docker rmi hello-world:latest
Untagged: hello-world:latest
Untagged: hello-world@sha256:d000bc569937abbe195e20322a0bde6b2922d805332fd6d8a68b19f524b7d21d
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
Deleted: sha256:ac28800ec8bb38d5c35b49d45a6ac4777544941199075dff8c4eb63e093aa81e
vagrant@docker2:~$ docker rmi -f hello-world:latest
Error response from daemon: No such image: hello-world:latest
▷ 랜카드 하나를 끊을 것이기에, net-tools 를 다운로드한다
vagrant@docker2:~$ sudo apt update
vagrant@docker2:~$ sudo apt install -y net-tools
▶ ifconfig 사용 가능해졌다
vagrant@docker2:~$ sudo ifconfig eth0 down
vagrant@docker2:~$ ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:8c:69:41 brd ff:ff:ff:ff:ff:ff
altname enp0s3
inet 10.0.2.15/24 metric 100 brd 10.0.2.255 scope global dynamic eth0
valid_lft 86400sec preferred_lft 86400sec
inet6 fe80::a00:27ff:fe8c:6941/64 scope link tentative
valid_lft forever preferred_lft forever
▩ 근데 핑이 간다 .. CentOS 로 전환
vagrant@docker2:~$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=115 time=31.1 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=115 time=31.5 ms
▶ CentOS 로 사전작업
● CentOS 로 다시 랜카드 끊어서 인터넷을 끊는다
[vagrant@docker1 work]$ sudo nmcli dev disconnect eth0
Device 'eth0' successfully disconnected.
[vagrant@docker1 work]$ sudo nmcli dev s
DEVICE TYPE STATE CONNECTION
eth1 ethernet connected System eth1
eth0 ethernet disconnected --
docker0 bridge unmanaged --
veth291fde8 ethernet unmanaged --
veth9cf3794 ethernet unmanaged --
lo loopback unmanaged --
[vagrant@docker1 work]$ ping 8.8.8.8
connect: Network is unreachable
▷ db 이미지 / mysql 이미지 CentOS 에서 삭제
[vagrant@docker1 work]$ docker rmi mariadb:latest
[vagrant@docker1 work]$ docker rmi mysql:latest
▶ Ubuntu 에서 mysql 과 DB 를 다운로드 한다
vagrant@docker2:~$ docker pull mysql
vagrant@docker2:~$ docker pull mariadb
■ 인터넷이 되는 장비에서 docker 이미지를 받아서 보안에 의해 인터넷을 끊은 장비로 보내주는 방법
>> 레이어로 저장되어 있는 이미지를 다 찾아서 하나씩 보내주기는 힘들다
>> 이럴때에는 image 를 tar 아카이브로 만들어서 보내면 된다
# 가장 뒤에는 도커 이미지이다
vagrant@docker2:~$ docker image save -o mysql.tar mysql
vagrant@docker2:~$ docker image save -o mariadb.tar mariadb
◎ sftp 로 접속해서 보낸다
vagrant@docker2:~$ sftp vagrant@192.168.25.10
The authenticity of host '192.168.25.10 (192.168.25.10)' can't be established.
ED25519 key fingerprint is SHA256:7lB7Vu/HAkdWjxrTGLNC8/9GPMAtJNbshCxWnYSEKes.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.25.10' (ED25519) to the list of known hosts.
vagrant@192.168.25.10's password:
Connected to 192.168.25.10.
sftp>
sftp> pwd
Remote working directory: /home/vagrant
sftp> ls
dbstore mydata work
sftp> !pwd
/home/vagrant
sftp> !ls
mysql.tar
sftp> put mysql.tar
Uploading mysql.tar to /home/vagrant/mysql.tar
mysql.tar 100% 619MB 67.5MB/s 00:09
▷ 이제 받은 tar 아카이브를 CentOS 에서 풀면안된다 풀지 않고 도커이미지로 만든다
>> mysql 이미지를 docker image를 받는 것처럼 레이어를 병렬로 받는다
[vagrant@docker1 ~]$ docker image load -i mysql.tar
# 실습 끝내고 다시 CentOS eth0 복구
[vagrant@docker1 ~]$ sudo nmcli dev connect eth0
Device 'eth0' successfully activated with '5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03'.
[vagrant@docker1 ~]$ nmcli dev s
DEVICE TYPE STATE CONNECTION
eth0 ethernet connected System eth0
eth1 ethernet connected System eth1
docker0 bridge unmanaged --
lo loopback unmanaged --
'Docker 와 Container' 카테고리의 다른 글
Dockerfile - EXPOSE / WORKDIR (0) | 2024.03.05 |
---|---|
Dockerfile - ENV / LABEL (0) | 2024.03.05 |
Dockerfile - ENTRYPOINT / CMD (0) | 2024.03.05 |
Docker Network (0) | 2024.03.04 |
Docker 의 기본 (0) | 2024.03.04 |