GitHub에서 구동하고 실행하는 절차는 Application에 어울리는 절차를 담고 있는게 아니라 Source Code만 있다.
Mac 에서 컴파일 하던지 Ubuntu에서 하던지 각 다른 환경에서 실행을 한다.
기존 이미지 자체는 변경이 불가능 하지만, docker image를 받아서 Container로 만들고 그 Container에서 수정된 정보를 적용해서 신규 이미지로 만드는 작업은 가능하다.
docker [image] pull [options] name:[tag]
# version 이나 tag 를 붙이지 않으면 version은 최신 버전 tag는 latest로 다운받는다.
# 기본적으로 docker.io가 default registry로 등록되어 있다.
~$ docker pull debian[:latest]
~$ docker pull library/debian:10
~$ docker pull docker.io/library/debian:10
~$ docker pull index/docker.io/library/debian:10
# 만일, private registry 나 클라우드의 저장소(ECR, GCR 등)의 이미지를 받는다면,
~$ docker pull 192.168.56.101:5000/debain:10
~$ docker pull gcr.io/google-samples/hello-app:1.0
[
{
"Id": "sha256:359570977af25b6ec87f2e0ee1e103e3826bade6175784cf98b04337278b1006",
"RepoTags": [
"httpd:2.4"
],
"RepoDigests": [
"httpd@sha256:5123fb6e039b83a4319b668b4fe1ee04c4fbd7c4c8d1d6ef843e8a943a9aed3f"
],
"Parent": "",
"Comment": "",
"Created": "2023-09-20T09:03:33.364033123Z",
"Container": "cfb386ae0931d0e738f59554849d9237213c4916c2472d9d7d17f13e710c772b",
"ContainerConfig": {
"Hostname": "cfb386ae0931",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
...
]
Digest
Container
ENV
CMD
IMAGE CREATED CREATED BY SIZE COMMENT
359570977af2 7 days ago /bin/sh -c #(nop) CMD ["httpd-foreground"] 0B
<missing> 7 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 7 days ago /bin/sh -c #(nop) COPY file:c432ff61c4993ecd… 138B
<missing> 7 days ago /bin/sh -c #(nop) STOPSIGNAL SIGWINCH 0B
<missing> 7 days ago /bin/sh -c set -eux; savedAptMark="$(apt-m… 82.4MB
<missing> 7 days ago /bin/sh -c #(nop) ENV HTTPD_PATCHES=rewrite… 0B
<missing> 7 days ago /bin/sh -c #(nop) ENV HTTPD_SHA256=dbccb84a… 0B
<missing> 7 days ago /bin/sh -c #(nop) ENV HTTPD_VERSION=2.4.57 0B
<missing> 7 days ago /bin/sh -c set -eux; apt-get update; apt-g… 11MB
<missing> 7 days ago /bin/sh -c #(nop) WORKDIR /usr/local/apache2 0B
<missing> 7 days ago /bin/sh -c mkdir -p "$HTTPD_PREFIX" && chow… 0B
<missing> 7 days ago /bin/sh -c #(nop) ENV PATH=/usr/local/apach… 0B
<missing> 7 days ago /bin/sh -c #(nop) ENV HTTPD_PREFIX=/usr/loc… 0B
<missing> 8 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 8 days ago /bin/sh -c #(nop) ADD file:a1398394375faab8d… 74.8MB
[ec2-user@ip-172-31-36-185 ~]$ sudo su -
[root@ip-172-31-36-185 ~]# cd /var/lib/docker/image/overlay2/distribution/diffid-by-digest/sha256
[root@ip-172-31-36-185 sha256]# ll
total 288
-rw-r--r--. 1 root root 71 Sep 28 04:02 01d159b8db2f24da97028c26bf6622e249e162b1adab06a3644c04f1c9fe2dd3
-rw-r--r--. 1 root root 71 Sep 28 06:31 053327351b4abdb9e49f7fde8334e6883910220be7c3129fd5c5487f5e612487
-rw-r--r--. 1 root root 71 Sep 27 16:37 076ff7a6074cf02eed64156d54feff57becf3f23068504c7109622ba3928f87a
-rw-r--r--. 1 root root 71 Sep 27 16:37 0ee278c19a4a58b76f7d438814d017c1d1ffff9c2f0f0cf6883505aef28b3ba3
-rw-r--r--. 1 root root 71 Sep 28 04:02 0f816efa513d909851c457ae41744fe3ff36ab19ebc2d72687d8c8f0594c93b3
-rw-r--r--. 1 root root 71 Sep 27 13:22 1150b893b52bb9e88099bf997d0295856bd72593bbea3d562f1c8a0cf02321bf
Debian Linux image 에 httpd image 를 설치하면 layer로 httpd layer 가 추가되고 web source를 따로 추가하면 layer로 추가가 된다.
docker push 를 수행하려면 다음과 같은 작업이 전제 된다.
1) docker login: hub.docker.com에 가입된 본인ID와 암호로 현재 로컬에 계정을 등록한다. (해제는 docker logout)
2) docker tag: hub.docker.com에 본인 계정의 Repositories에 넣기 위한 태그를 수행한다. (tag는 이미지의 새로운 참조명을 넣는 방법. 간혹, OS, 버전 표시로 활용하기도 한다.)
# "암호"로 접근하는 방법
~$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: (본인계정 확인)
Password:
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[ec2-user@ip-172-31-36-185 ~]$ docker info | grep Username
Username: (본인계정 확인)
# 입력한 암호는 암호화 되지 않는다.
# 제공되는 경로를 열어보면 암호코드처럼 생긴 값이 있지만, base64 인코딩 값이다.
[ec2-user@ip-172-31-36-185 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myweb v1.0 22bdc5972f40 21 hours ago 41.4MB
nginx latest 61395b4c586d 7 days ago 187MB
httpd 2.4 359570977af2 8 days ago 168MB
portainer/portainer-ce latest d7f7a88e1acc 8 days ago 294MB
bash latest 3c04497fad88 7 weeks ago 13.9MB
mysql 5.7-debian 6dca13361869 2 months ago 463MB
nginx 1.25.0 7d3c40f240e1 3 months ago 143MB
nginx 1.25.0-alpine fe7edaf8a8dc 4 months ago 41.4MB
mariadb 10.2 625e5b493bbb 14 months ago 338MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
ubuntu 16.04 b6f507652425 2 years ago 135MB
nginx 1.19 f0b8a9a54136 2 years ago 133MB
[ec2-user@ip-172-31-36-185 ~]$ docker image tag myweb:v1.0 jinsungdae/myweb:v1.0
[ec2-user@ip-172-31-36-185 ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myweb v1.0 22bdc5972f40 21 hours ago 41.4MB
wlstjdeo00/myweb v1.0 22bdc5972f40 21 hours ago 41.4MB
nginx latest 61395b4c586d 7 days ago 187MB
httpd 2.4 359570977af2 8 days ago 168MB
portainer/portainer-ce latest d7f7a88e1acc 8 days ago 294MB
bash latest 3c04497fad88 7 weeks ago 13.9MB
mysql 5.7-debian 6dca13361869 2 months ago 463MB
nginx 1.25.0 7d3c40f240e1 3 months ago 143MB
nginx 1.25.0-alpine fe7edaf8a8dc 4 months ago 41.4MB
mariadb 10.2 625e5b493bbb 14 months ago 338MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
ubuntu 16.04 b6f507652425 2 years ago 135MB
nginx 1.19 f0b8a9a54136 2 years ago 133MB
[ec2-user@ip-172-31-36-185 ~]$ docker push jinsungdae/myweb:v1.0
The push refers to repository [docker.io/jinsungdae/myweb]
058e54c811c8: Pushed
8d68b6b128f7: Mounted from library/nginx
c8db7b4be633: Mounted from library/nginx
0fbe8c68abd3: Mounted from library/nginx
664eb87278f9: Mounted from library/nginx
30085473d084: Mounted from library/nginx
d007f013021f: Mounted from library/nginx
f1417ff83b31: Mounted from library/nginx
v1.0: digest: sha256:d95300aed2d82650608f6ac8a4942830eeb851edf4ec55ca70d9fdf13ed68cc4 size: 1989
~$ docker pull jinsungdae/myweb:v1.0
~$ docker run -d -p 8001:80 --name=myweb jinsungdae/myweb:v1.0
~$ curl localhost:8001
[ec2-user@ip-172-31-36-185 save_lab]$ docker image save nginx > nginx1.tar
[ec2-user@ip-172-31-36-185 save_lab]$ ll
total 506340
-rw-r--r--. 1 ec2-user ec2-user 518489600 Sep 28 12:13 nginx1.tar
[ec2-user@ip-172-31-36-185 save_lab]$ docker image save nginx | gzip > nginx.tar.gz
[ec2-user@ip-172-31-36-185 save_lab]$ ls -lh
total 678M
-rw-r--r--. 1 ec2-user ec2-user 184M Sep 28 12:14 nginx.tar.gz
-rw-r--r--. 1 ec2-user ec2-user 495M Sep 28 12:13 nginx1.tar
[ec2-user@ip-172-31-36-185 save_lab]$ docker image save nginx | bzip2 > nginx1.tar.bz2
[ec2-user@ip-172-31-36-185 save_lab]$ ls -lh
total 843M
-rw-r--r--. 1 ec2-user ec2-user 184M Sep 28 12:14 nginx.tar.gz
-rw-r--r--. 1 ec2-user ec2-user 495M Sep 28 12:13 nginx1.tar
-rw-r--r--. 1 ec2-user ec2-user 165M Sep 28 12:16 nginx1.tar.bz2
~$ scp nginx1.tar.gz host2@(server):/home/(이름)/backup/nginx1.tar.gz
-------------------------------------------------------------------------
host2~$ docker image load < nginx1.tar.gz
Load image : nginx:1.0
host2~$ docker images
host2~$ docker un -itd -p 8200:80 nginx:1.0
host2~$ curl localhost:8200
docker image rm [옵션] {이미지명[:태그] | 이미지ID}
docker rmi [옵션] {이미지명[:태그] | 이미지ID}
# 이미지 전체 삭제
~$ docker rmi $(docker images -q)
# 특정 이미지명이 포함된 것만 삭제.
~$ docker rmi $(docker images | grep debian)
# 반대로 특정 이미지명이 포함된 것만 제외하고 모두 삭제.
~$ docker rmi $(docker images | grep -v centos)
# 자주 사용하는 명령등을 전역 alias로 적용하여 활용하면 편리하다.
~$ vi .bashrc
# 상태가 exited인 container를 찾아서 모두 삭제
alias cexrm='docker rm $(docker ps --filter 'status=exited' -a -q)'
# 설정한 alias를 적용하고 확인
~$ source .bashrc
~$ alias
aliascexrm='docker rm $(docker ps --filter 'status=exited' -a -q)'
# 현재 centos:7 이미지를 사용 중인 컨테이너가 있다.
~$ docker ps -a
# 이미지를 삭제하면 ?
~$ docker image rm centos:7
Error response from daemon: conflict: unable to remove repository reference "centos:7"
# 해당 컨테이너 stop 후 rm으로 컨테이너 삭제
~$ docker stop 0b5612~~~ (Process 삭제)
~$ docker rm 0b5612~~~ (snapshot 삭제)
[ec2-user@ip-172-31-36-185 save_lab]$ docker pull registry
Using default tag: latest
latest: Pulling from library/registry
7264a8db6415: Already exists
c4d48a809fc2: Pull complete
88b450dec42e: Pull complete
121f958bea53: Pull complete
7417fa3c6d92: Pull complete
Digest: sha256:d5f2fb0940fe9371b6b026b9b66ad08d8ab7b0d56b6ee8d5c71cb9b45a374307
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
[ec2-user@ip-172-31-36-185 save_lab]$ docker images | grep registry
registry latest 0030ba3d620c 7 weeks ago 24.1MB
[ec2-user@ip-172-31-36-185 save_lab]$ docker run -d \
> -v /home/ec2-user/registry_data:/var/lib/registry \
> -p 5000:5000 \
> --restart=always \
> --name=local-registry \
> registry
8d2b4736dbe114cbd3e5aabbfa14dd91e351acd335f287c88cc38e41567e6be4
[ec2-user@ip-172-31-36-185 save_lab]$ docker ps | grep registry
8d2b4736dbe1 registry "/entrypoint.sh /etc…" 26 seconds ago Up 24 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp local-registry
[ec2-user@ip-172-31-36-185 save_lab]$ sudo netstat -nlp | grep 5000
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 83747/docker-proxy
tcp6 0 0 :::5000 :::* LISTEN 83752/docker-proxy
[ec2-user@ip-172-31-36-185 save_lab]$ curl -X GET localhost:5000/v2/_catalog
{"repositories":[]}
~$ docker image tag myweb:v1.0 192.168.56.101(주소):5000/myweb:v1.0
~$ docker push 192.168.56.101(주소):5000/myweb:v1.0
The push refers to repository [192.168.56.101:5000/myweb]
Get "https://192.168.56.101:5000/v2": http: server gave HTTP response to HTTPS client
~$ sudo vi /etc/init.d/docker
...
DOCKER_OPTS=--insecure-registry 192.168.56.101:5000
~$ sudo vi /etc/docker/daemon.json
{ "insecure-registries": ["192.168.56.101:5000"]}
~$ sudo systemctl restart docker.service
[시나리오] 현재 운용 중인 Hostos1(registry server)과 hostos2(client)를 이용해 private push/pull을 수행해 본다.
~host2$ curl -x GET http://192.168.56.101:5000/v2/_catalog
{"repositories":["myweb"]}
~host2$ curl -X GET http://192.168.56.101:5000/v2/myweb/tags/list
{"name":"myweb", "tags":["v1.0","v1.1"]}
~host2$ docker pull 192.168.56.101:5000/myweb:1.0
~host2$ docker image tag 192.168.56.101:5000/myweb:1.0 dev_http:1.1
~host2$ docker images
~host2$ docker run -d -p 8100:80 --name myweb-server dev_http:1.1