0913(화) - 도커3

Yuri JI·2022년 9월 13일
0

Kakao Cloud School

목록 보기
8/27
  • 컨테이너 포트 번호 표시 : docekr ps

    0.0.0.0:9559->8080/tcp -> IPv4
    :::9559->8080/tcp -> :(세미콜론)나오면 IPv6

port 이렇게 변환해주는 기술이 NAT, ? docker에서는 docker proxy가 담당한다.

  • tree
    sudo apt -y install tree

📕 실습 1. git통한 Dockerfile과 Source 공유

  • 저번 시간에는 개발팀에서 코드를 zip 파일로 전달받았다고 가정.

  • 실무에서는 git으로 전달해준다(gitops)or 공용 클라우드 활용

  • docker -h phpserver : 컨테이너의 호스트명을 phpserver로 지정한다.
    작업할 땐 docker exec -it [컨테이너 이름] bash라고 시작하면 컨테이너 id가 호스트명이 된다.

# git으로 코드를 공유받았다고 가정. Directory 단위로 개발한다. 
yji@hostos1:~/LABs$ git clone https://github.com/brayanlee/docker-phpserver.git
Cloning into 'docker-phpserver'...
...생략

# Dockerfile 확인
yji@hostos1:~/LABs/docker-phpserver$ cat Dockerfile
FROM php:7.2-apache

MAINTAINER datastory Hub <hylee@dshub.cloud>

ADD index.php /var/www/html/index.php

EXPOSE 80

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

# Dockerfile 이용해서 image 생성
yji@hostos1:~/LABs/docker-phpserver$ docker build -t phpserver:1.0 .

# Docker image 확인 
yji@hostos1:~/LABs/docker-phpserver$ docker images | grep php
phpserver         1.0             1385adda691e   About a minute ago   410MB
php               7.2-apache      c61d277263e1   21 months ago        410MB
yji@hostos1:~/LABs/docker-phpserver$ docker run -it -d -p 8004:80 \
> -h phpserver --name=phpserver phpserver:1.0
cd03d1e2944d14027aa1e5a341e05f27f7e23f89ea6f6d1109e62a6a290977e6

yji@hostos1:~/LABs/docker-phpserver$ docker exec -it phpserver bash

root@phpserver:/var/www/html# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

root@phpserver:/var/www/html# service apache2 status
[ ok ] apache2 is running.
root@phpserver:/var/www/html#

# ctrl + q + p 눌러서 컨테이너 빠져나온 후 docker cp로 index.php 파일 변경
yji@hostos1:~/LABs/docker-phpserver$ docker cp index.php2 phpserver:/var/www/html/index.php


📕 실습 2. jupyter notebook 컨테이너 실행

  • 급하게 jupyter notebook 필요할 때 다운받지말고 컨테이너로 간편하게 띄우면 된다
yji@hostos1:~/LABs/docker-phpserver$ docker pull python:3.8-slim
3.8-slim: Pulling from library/python
7a6db449b51b: Extracting  28.51MB/31.38MB
e238bceb2957: Download complete
28c96731353f: Download complete
3154e472820f: Download complete
0a46f1dda381: Download complete
  • ⭐ 레이어 5개로 이루어진 계층 구조 -> 이 레어이들이 merge 된 채로 -> container run하면 스냅샷 찍어서 /var/lib/docker에 저장한다.

  • fuse가 mount 작업을 해

Var~ 디렉토리 자체가 데몬처럼 올라온다.

디렉토리를 올려서 프로세스에 붙이는게 컨테이너
Fuse 가 컨테이너화 시켜서 프로세스에 붙여 …

  • 이미지 레이어 = 정적 read only
  • 프로세스/컨테이너 레이어 = 동적 read write
yji@hostos1:~$ docker pull vishwasnarayanare/jupyternotebook

실습 2-1. 로또 게임(1초마다 랜덤 번호 추첨)

# 8900 포트는 실습 2-2 에서 필요함.
#  -p 8900:8900 이 옵션을 적으면 docker proxy가 동작한다.
docker run -itd --name=py-test -p 8900:8900 python:3.8-slim

docker ps | grep python

#  컨테이너 나와서 
docker cp py_lotto.py py-test:/py_lotto.py
docker cp py_http.py py-test:/py_http.py
docker exec -it py-test python /py_lotto.py
(docker exec -it [컨테이너명] [명령어])

실습 2-2. 소켓 통신이 가능한 python 모듈 활용해서 웹 프로그래밍

yji@hostos1:~/LABs/python$ docker exec -it py-test python /py_http.py
Server running on port:8900

+ )남의 이미지를 사용할 때, 점검 먼저해야한다

vishwasnarayanare/jupyternotebook   latest          c4d398d39f45   17 months ago    3.2GB

실습3. jupyter notebook

yji@hostos1:~$ docker run -it -p 8888:8888 --name=pyjupyter vishwasnarayanare/jupyternotebook
[I 2022-09-13 01:09:21.227 ServerApp] jupyterlab | extension was successfully linked.
[I 2022-09-13 01:09:21.237 ServerApp] Writing notebook server cookie secret to /root/.local/share/jupyter/runtime/jupyter_cookie_secret
[I 2022-09-13 01:09:21.779 ServerApp] nbclassic | extension was successfully linked.

..생략 

    To access the server, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/jpserver-1-open.html
    Or copy and paste one of these URLs:
        http://a0c494b0c8ce:8888/lab?token=86c54ed0964bc9325aefc1051ffee5997ee1795790e8fe7d
        http://127.0.0.1:8888/lab?token=86c54ed0964bc9325aefc1051ffee5997ee1795790e8fe7d
 http://127.0.0.1:8888/lab?token=86c54ed0964bc9325aefc1051ffee5997ee1795790e8fe7d

맨 아래 주소 ip 변경 > 브라우저에서 접속
http://192.168.56.101:8888/lab?token=86c54ed0964bc9325aefc1051ffee5997ee1795790e8fe7d

  • 파이썬 모듈 확인
yji@hostos1:~/LABs/python$ docker exec -it pyjupyter bash
root@a0c494b0c8ce:/jup#
  • folium으로 지도에 원하는 위치 표시하기

import folium
!pip install folium

seoulforest=folium.Map(location=[37.544392,127.0352537], zoom_start=15)
folium.Marker([37.544392,127.0352537], popup='서울숲공원').add_to(seoulforest)
folium.CircleMarker([37.544392,127.0352537], radius=30,
                   popup='서울숲공원', color='#3186cc',
                   fill_color='#3186cc',).add_to(seoulforest)
                   
seoulforest


실습 4.

윈도우에 접속하기 위해선 -p 옵션이 필요하다.

yji@hostos1:~/LABs/node$ vim runapp.js

# 노드없어서 에러발생
yji@hostos1:~/LABs/node$ node runapp.js
Command 'node' not found, but can be installed with:
sudo apt install nodejs

yji@hostos1:~/LABs/node$ docker pull node:17-slim

yji@hostos1:~/LABs/node$ docker run -itd -p 9000:8000 --name=mynode node:17-slim
cbb81845e05851dbf602c40416601f5fed548a2864d0e775f99ef7daeed268cf


yji@hostos1:~/LABs/node$ docker cp runapp.js mynode:/runapp.js
yji@hostos1:~/LABs/node$ docker exec -it mynode ls
bin   dev  home  lib64  mnt  proc  run        sbin  sys  usr
boot  etc  lib   media  opt  root  runapp.js  srv   tmp  var

# node service start 
yji@hostos1:~/LABs/node$ docker exec -it mynode node /runapp.js


# 다른 터미널 : HostOS에ㅐ서 node container의 IP 확인
yji@hostos1:~/LABs/node$ docker inspect mynode | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.7",
                    "IPAddress": "172.17.0.7",

실습 5. mongoDB

mysql의 행을 mongoDB에서는 Document라고 한다.
mongoDB는 json 형태로 데이터 저장

  • mongoDB -> humongous -> 거대한 -> bigdata (무작위 데이터)
    -> Robo3T 사용

mysql : 3306
mongoDB : 27017

# mongoDB 5.0 설치
yji@hostos1:~/LABs/node$ docker pull mongo:5.0

# mongoDB container 실행 



docker run -itd --name=mongodb -p 27017:27017 mongo:5.0

docker ps | grep mongo

docker exec -it mongodb bash

show dbs
use sampledb
db
db.t1.insert({name:'yji', job:'dev'})
db.t1.find()



https://docs.docker.com/


docekr 명령어 1) docker port 확인

  • image 다운받는 저장소는 변할 수 있다 !

    • docker pull docker.io/library/mongo:5 : docker hub에서 이미지 다운로드
      docker pull gcr.io/google-samples/hello-app:1.0 : google gcr에서 이미지 다운로드
      docker pull 192.168.56.200:5000/myweb:1.0

      -> docker pull 하기 전에 hub.docker.com 에서 해당 image 정보를 확인 한다.
      -> latest 버전은 비추합니다.

docker history
docker inspect ... EXPOSE 확인

docker pull mongo:5.0
이미지 검색은 어디서해 ? -> docker info로 확인
docker info | grep -i registry

GCP GCR (Google Container Registry)

docker pull gcr.io/google-samples/hello-app:1.0

  • 이미지의 용량 확인

  • 포트 확인 -> EXPOSE [port번호]

yji@hostos1:~/LABs$ docker image history mongo:5
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
8f7e5d5cbbde   5 days ago    /bin/sh -c #(nop)  CMD ["mongod"]               0B
<missing>      5 days ago    /bin/sh -c #(nop)  EXPOSE 27017                 0B
  • myweb:1.0 이미지 확인
yji@hostos1:~/LABs$ docker image history myweb:1.0
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
38fe5550c627   4 days ago    /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
adf6d35d5e5e   4 days ago    /bin/sh -c #(nop)  EXPOSE 80/tcp                0B
e172e436139c   4 days ago    /bin/sh -c #(nop) COPY file:c4448fcb64c9b935…   63.6kB
ab998aedd28b   4 days ago    /bin/sh -c #(nop) COPY file:f9f59362757a6f6e…   160B
804f9cebfdc5   4 weeks ago   /bin/sh -c #(nop)  CMD ["nginx" "-g" "daemon…   0B
<missing>      4 weeks ago   /bin/sh -c #(nop)  STOPSIGNAL SIGQUIT           0B
<missing>      4 weeks ago   /bin/sh -c #(nop)  EXPOSE 80                    0B
<missing>      4 weeks ago   /bin/sh -c #(nop)  ENTRYPOINT ["/docker-entr…   0B
<missing>      4 weeks ago   /bin/sh -c #(nop) COPY file:09a214a3e07c919a…   4.61kB
<missing>      4 weeks ago   /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7…   1.04kB
<missing>      4 weeks ago   /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0…   1.96kB
<missing>      4 weeks ago   /bin/sh -c #(nop) COPY file:65504f71f5855ca0…   1.2kB
<missing>      4 weeks ago   /bin/sh -c set -x     && addgroup -g 101 -S …   18MB
<missing>      4 weeks ago   /bin/sh -c #(nop)  ENV PKG_RELEASE=1            0B
<missing>      4 weeks ago   /bin/sh -c #(nop)  ENV NJS_VERSION=0.7.6        0B
<missing>      4 weeks ago   /bin/sh -c #(nop)  ENV NGINX_VERSION=1.23.1     0B
<missing>      4 weeks ago   /bin/sh -c #(nop)  LABEL maintainer=NGINX Do…   0B
<missing>      4 weeks ago   /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>      4 weeks ago   /bin/sh -c #(nop) ADD file:2a949686d9886ac7c…   5.54MB
  • 예쁘게 보기
  1. 해서 docker history 뽑아내기
    docker image history httpd:2.4 --no-trunc > httpd_dockerfile.txt

  2. 로컬 PC (윈도우) 로 파일 가져오기

  3. notepad+ or vs code 등 이용해서 보기


  • image는 layer 즉, 계층 구조의 집합 형태이다. layer 단위로 다운로드 > merged > snapshot

  • ⭐ 컨테이너의 실체
    1. image의 snapshot이다. -> /var/lib/docker~
    그러면 아까 python 실습에서 py_lotto.py을 /var/lib/docker~ 아래서 찾아보자


root@hostos1:/var/lib/docker/overlay2# find / -name py_lotto.py
/home/yji/LABs/python/py_lotto.py



/var/lib/docker/overlay2/ca3582196578631902d16cf692146061cda58d9399bb4ecb54b30f5c8e9bf6b2/diff/py_lotto.py

2. process 이다.
3. image는 container의 infra(H/W -> cgroup, OS)를 제공한다. 
  • 도커 로그는 json 형태
    yji@hostos1:~/LABs$ docker info | grep json
    Logging Driver: json-file
  • Dockerfile로 image build를 통해 image 생성, image는 불변 ~ 유일하게 변경가능한 것(R/W)은 Container !
-> 라인 수 > Step > layer
-> build 과정은 image -> container -> image -> container의 반복 
마지막 컨테이너의 아이디가 `docker image inspect`에 올라온 것이다 ~ 

# 이미지가 컨테이너가 되면 아파치를 띄우세요
"Cmd": [
                "httpd-foreground"
            ],
            
            
# WorkingDir > 컨테이너 접속 시 기본 경로. 보통 핵심 소스파일이 있는 곳으로 설정한다.

## 이거 왜 확인했지 
yji@hostos1:~/LABs/python$ docker exec -it httpd-test bash
root@f052091d0469:/usr/local/apache2# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

docker image inspect로 image의 환경변수 파악 후 부족한 부분은 내가 추가할 수 있어야한다.

yji@hostos1:~/LABs$ docker image inspect --format="{{ .ContainerConfig.Env }}" httpd:2.4
[PATH=/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HTTPD_PREFIX=/usr/local/apache2 HTTPD_VERSION=2.4.54 HTTPD_SHA256=eb397feeefccaf254f8d45de3768d9d68e8e73851c49afd5b7176d1ecf80c340 HTTPD_PATCHES=]

docker inspect : 컨테이너 -> 이걸로 IP 확인함.
: MAC 주소와 IP 주소는 이미지가 가질 수 없다. (이미지 = 정적) MAC주소 IP주소는 docker의 namespace가 할당한다. !

docker inspect = docker container inspect
docker image inspect = docker image inspect


밥 먹구 ~ ~

container / image 삭제

  • image 삭제 전 반드시 참조 중인 container는 없어야한다. 강제 삭제 (--force) 하지만 강제는 권고사항아님
# 여러 개 동시에 삭제하고싶으면 옆에 나열하면 된다.
docekr stop [컨테이너 이름 | 컨테이너 id]
docekr rm [컨테이너 이름 | 컨테이너 id] 
docker rmi [이미지명]

# 하지만 몇 백개씩 된다면 ?
# 도커 커맨드 활용 ! 

yji@hostos1:~$ docker stop py-test
py-test
yji@hostos1:~/LABs$ docker rm py-test
py-test


yji@hostos1:~/LABs$ docker rm itemdb
itemdb
yji@hostos1:~/LABs$ docker rmi mariadb:10.2
Untagged: mariadb:10.2
Untagged: mariadb@sha256:df0221d698d67296d78a35bc5687f0cb0df6b3cad6712e8cfafa65c006f5581c
Deleted: sha256:625e5b493bbbb2b4a37825391f7df8e298fc7883bb3e69b65d5e68602c4179f7
Deleted: sha256:853fdc002e931597b2f68dc08ef8594a40497691c6b77403f142b1559bfa48a9
Deleted: sha256:1f4d1ed5236aa5f9d0ba7d876e469b694c8dc0873c812d865c953a6783c0b4e1
Deleted: sha256:3cda0620a4c7885bf3dacd9d719dbc9eca42da150d4469c1cdea64bab0668848
Deleted: sha256:8eb4d73c685d2fb5f66c067d1bc246ffac926bc918222b98aa9d495a9152e2c3
Deleted: sha256:ac3945005adb0113bafbd96fed6e3907c622cc5013764ad287ae8d8620fbc93d
Deleted: sha256:0fdab41f48069dd6283cd812160188294fecb3a6b489b172cf439ff64527c545
Deleted: sha256:4f3335f79fe1e59a189a2bd2665748e0a19f6447023568343724b52332844ca8
Deleted: sha256:dcbf25e998d3ab3eae5cd5791d24c9d4741650cac0ebb42e88cd7f6196ad986b
Deleted: sha256:b4cdde1b80519893f726187be38b613d37ff68ec15f9bf45ec7cb483fd483c7c
Deleted: sha256:197d3735c0d4a631e87485049bf2431765f23756f7843d35efaa0eac160ecc77
Deleted: sha256:ea0f4a05d93cecef3eea552b9147d678ad0fba4056f6f51914122cf7976485fe
Deleted: sha256:e722d396f503c712107acad2a081b07e33e73d6286c43f58234f69345a216918

docker command 활용한 삭제 & alias로 별칭 생성 ( cexrm )

yji@hostos1:~$ docker ps -a -q
f052091d0469
cbb81845e058
a0c494b0c8ce
cd03d1e2944d
1a671ffb4e91
70dffa1d629f
5436e97f6bcd
1592f89474bc

# 죽은 컨테이너(status가 exited인 컨테이너)만 필터링 
yji@hostos1:~$ docker ps -a -q --filter 'status=exited'
70dffa1d629f
5436e97f6bcd
yji@hostos1:~$ docker rm $(docker ps -a -q --filter 'status=exited')
70dffa1d629f
5436e97f6bcd
yji@hostos1:~$ docker ps -a -q --filter 'status=exited'

# alias로 간단하게 사용하자. (전역화 필수  ~)
alias cexrm='docker rm $(docker ps -a -q --filter 'status=exited')'

docker rm $(docker ps -a -q --filter 'status=exited')


yji@hostos1:~$ vim .bashrc
yji@hostos1:~$ source .bashrc

# alias는 hostos2 에도 똑같이 셋팅.
yji@hostos1:~$ alias
alias cexrm='docker rm $(docker ps -a -q --filter 'status=exited')'

# 아무것도 안뜨면 로그인 안되어있는 것임
yji@hostos1:~/LABs$ docker info | grep -i username
yji@hostos1:~/LABs$

yji@hostos1:~/LABs$ 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: ur2e
Password:
WARNING! Your password will be stored unencrypted in /home/yji/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
yji@hostos1:~/LABs$ docker info | grep -i username
 Username: ur2e
# auth : 얼핏보면 암호화된 것 같지만 BASE64인코딩 된 것일 뿐이다.
yji@hostos1:~/LABs$ cat /home/yji/.docker/config.json
{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": "7Jyg7KCA7J2066aEOuu5hOuwgOuyiO2YuAo=
"
                }
        }

yji@hostos1:~/LABs$ echo 7Jyg7KCA7J2066aEOuu5hOuwgOuyiO2YuAo= | base64 --decode
유저이름:비밀번호
  • 진짜 암호화 알고리즘이 적용될 경우 매우 무거워지기때문에 base64 인코딩만 한 것이다. 따라서, docker logout을 꼭 해주자.

  • 다른 방법으로는, docker hub 사이트에서 계정 > Account Setting > Security


토큰기법 로그인

# docker logout 후에 .access_token에 복사한 토큰 붙여넣기 

yji@hostos1:~$ vim .access_token
yji@hostos1:~$ docker logout
Removing login credentials for https://index.docker.io/v1/
yji@hostos1:~$ cat .access_token | docker login --username ur2e --password-stdin
WARNING! Your password will be stored unencrypted in /home/yji/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
yji@hostos1:~$ docker info | grep -i username
 Username: ur2e
  • 잠시 자리를 비울 경우 docker hub 홈페이지에서 access token을 acitve상태를 no로 바꿔주면 로그인이 되지 않는다.


docker hub에 이미지 업로드

  • registry에 생성한 image upload(push)
    1) docker login / logout -> 계정자에게 push 하기 위해서
    2) docker image tag -> why? 업로드할 주소 입력을 위해 작성 docker.io/ur2e
    3) docker push 계정자 ID/저장소:태그(ur2e/이미지명:버전 -> 주소)

yji@hostos1:~$ docker images | grep myweb
myweb                               2.0             ac0a3ab4ac5b   6 hours ago     28.4MB
myweb                               1.0             38fe5550c627   4 days ago      23.6MB
yji@hostos1:~$ docker image tag myweb:1.0 ur2e/myweb:1.0
yji@hostos1:~$ docker images | grep myweb
myweb                               2.0             ac0a3ab4ac5b   6 hours ago     28.4MB
ur2e/myweb                          1.0             38fe5550c627   4 days ago      23.6MB
myweb                               1.0             38fe5550c627   4 days ago      23.6MB
yji@hostos1:~$ docker push ur2e/myweb:1.0
The push refers to repository [docker.io/ur2e/myweb]
f97a5c6c3378: Pushed
90e4850a4894: Pushed
bf4e176a4d9b: Mounted from library/nginx
a1d571e4e83d: Mounted from library/nginx
6d97b4d00719: Mounted from library/nginx
2a7647ca3937: Mounted from library/nginx
549c42eea4a6: Mounted from library/nginx
994393dc58e7: Mounted from library/nginx
1.0: digest: sha256:170650981293f5ba343b4340c250b9d0da72a725fac9339d2b20925558fa15b1 size: 1984
  • Dockerhub 에서 확인 가능

yji@hostos1:~$ docker images | grep myweb
myweb                               2.0             ac0a3ab4ac5b   6 hours ago     28.4MB
ur2e/myweb                          1.0             38fe5550c627   4 days ago      23.6MB
myweb                               1.0             38fe5550c627   4 days ago      23.6MB
yji@hostos1:~$ docker image tag myweb:2.0 ur2e/myweb:2.0
yji@hostos1:~$ docker push ur2e/myweb:2.0

실습 2. Mysql 5.7 & 8.0 이미지 올리기

  1. 기존 image에 tag 설정: 저장소명은 mysql_repo
  2. 조회 후 hub.docker.com에 push
  3. HostOS2에서 확인
  • mysql 컨테이너 시작
    /etc/init.d/mysql start

  • devops 엔지니어는 docker hub에 이미지를 docker push.
    이걸 개발자들이 사용한다.
    변경이 있었다면 버전 제어를 통해 CI/CD.
    그 다음 QA (품질관리) 팀에서 새롭게 올라온 v2를 확인해준다. how? run test
  • docekr run = [pull] + cerate + start + [command]
yji@hostos1:~$ docker create -it --name myubuntu16-1 ubuntu:16.04
d72a40c3ecde08b028ee89903b686b2189f5f50d8e479239081da47023cfb917
yji@hostos1:~$ docker ps -a | grep myubuntu
d72a40c3ecde   ubuntu:16.04                        "/bin/bash"              21 seconds ago   Created                                                  myubuntu16-1

yji@hostos1:~$ docker start myubuntu16-1
myubuntu16-1
yji@hostos1:~$ ps -ef | grep myubuntu16-1
yji        21768    8755  0 15:34 pts/3    00:00:00 grep --color=auto myubuntu16-1
yji@hostos1:~$ docker ps | grep myubuntu16-1
d72a40c3ecde   ubuntu:16.04                        "/bin/bash"              About a minute ago   Up 17 seconds                                               myubuntu16-1
yji@hostos1:~$ docker attach myubuntu16-1
root@d72a40c3ecde:/#
root@d72a40c3ecde:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

docker run 옵션

옵션설명
-iinteractive
-ttty(단말) -it : 작업수행
-ddetach(백그라운드로 실행 ex. nginx -> -d
-ppublicsh host_port:container_port
-e환경변수 ex.DB, 다수 환경 변수 사용시 -> -e ~ -e ~ -e ~
--restart=always, default값은 '=no', =always면 사용자 stop이 아닌 예기치 않은 컨테이너 종료 시 자동 재시작
kubenetes에서는 기본값이 restart=Always로 되어있음= auto-healing
--name컨테이너이름지정
--rmcontainer stop과 동시에 자동 rm 수행 -> test용 container에 적합
-ucontainer 기본 유저는 root, 특정 계정에서 application 수행 시 그 계정명을 지정한다. ex. -u=yji
-wworkdir와 같이 컨테이너 내부 접속 시 연결되는 경로를 지정
-v볼륨 지정(NFS와 유사, container to host, host to container)

이미지 컨테이너 네트워크 볼륨

  • 환경변수 많을 경우에는
  1. vim env_list : env_list 파일에 환경변수 저장
  2. --env-file=env_list 옵션으로 파일을 환경 변수로 지정
  • docker --rm (스냅샷까지 싹 지움) 이용한 로그 ..체크..
yji@hostos1:~$ docker run -d --rm centos /bin/ping localhost
4d53bf9eb57fe822b069e8a0c1b8b5e7ed256cc0a427b09086c77ab0dec71fce
yji@hostos1:~$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                       NAMES
4d53bf9eb57f   centos                   "/bin/ping localhost"    15 seconds ago   Up 14 seconds                                               reverent_wilbur
1a671ffb4e91   myweb:2.0                "/docker-entrypoint.…"   7 hours ago      Up 7 hours      0.0.0.0:8003->80/tcp, :::8003->80/tcp       myweb3
1592f89474bc   google/cadvisor:latest   "/usr/bin/cadvisor -…"   5 days ago       Up 7 hours      0.0.0.0:9559->8080/tcp, :::9559->8080/tcp   cadvisor
yji@hostos1:~$ docker logs -f 4d53bf9eb57f
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.055 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.058 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.056 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.055 ms
  • docker --env-file
yji@hostos1:~/LABs$ vim env_list
yji@hostos1:~/LABs$ cat env_list
JAVA_HOME=/java/jre1.0
JAVA_JVM=/java/jvm1.0
yji@hostos1:~/LABs$ docker run -it --env-file=env_list -w /java/jre1.0 centos:7 bash
[root@49e47a5e10dc jre1.0]# 

cadvisor

컨테이너가 사용중인 리소스 사용량을 수집한다.
컨테이너가 사용중인 자원 소비량을 측정한 결과 -> metric -> cadvisor를 통해 모니터링 : docker stats
linux에서 top : 모든 프로세스 보여줌
docker top : 자신의 프로세스만 보여줌 (?)

# publishing 된 정보만 따로 볼 수 있음 
yji@hostos1:~/LABs$ docker port myweb1
80/tcp -> 0.0.0.0:8001
80/tcp -> :::8001

# 이게뭐지 
yji@hostos1:~/LABs$ docker top myweb1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                23983               23964               0                   16:17               ?                   00:00:00            nginx: master process nginx -g daemon off;
systemd+            24041               23983               0                   16:17               ?                   00:00:00            nginx: worker process
  • docker run -d --name=myweb2 -p 8002:80 myweb:1.0
    -> 이거 설명해보세요.
    -p: 네트워크 기능 활성화.

  • 내부 이벤트 정보. docker system events

  • 컨테이너 잠깐 멈추기 (일시정지) 왜 가능? 컨테이너 = 프로세스
    docker restart / pause / unpause

yji@hostos1:~/LABs$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED          STATUS          PORTS                                       NAMES
fe6b04776c48   myweb:1.0                "/docker-entrypoint.…"   47 seconds ago   Up 46 seconds   0.0.0.0:8002->80/tcp, :::8002->80/tcp       myweb2

yji@hostos1:~/LABs$ docker pause myweb2
myweb2
yji@hostos1:~/LABs$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS                       PORTS                                       NAMES
fe6b04776c48   myweb:1.0                "/docker-entrypoint.…"   About a minute ago   Up About a minute (Paused)   0.0.0.0:8002->80/tcp, :::8002->80/tcp       myweb2

yji@hostos1:~/LABs$ docker unpause myweb2
myweb2
yji@hostos1:~/LABs$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                                       NAMES
fe6b04776c48   myweb:1.0                "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes   0.0.0.0:8002->80/tcp, :::8002->80/tcp       myweb2
  • docker rename : 컨테이너 이름 변경
yji@hostos1:~/LABs$ docker rename myweb2 mywebserver2
yji@hostos1:~/LABs$ docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                                       NAMES
fe6b04776c48   myweb:1.0                "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:8002->80/tcp, :::8002->80/tcp       mywebserver2
  • attach 쓰면 문제점
    • 세션을 공유하기때문에 위 아래 세션 한 곳을 동작해도 두 세션이 같이 움직인다. exit를 누르면 두 세션 다 나가지는 위험함이 있다. 그냥 docker exec를 사용하자
  • nginx.conf : 기본 역할 : 웹서버, 근데 proxy로 재구성 가능하다.

docker cp : 언제 사용하는지!

컨테이너에 들어갔는데 vi가 없어서 파일 수정 불가 -> 이 컨테이너에 vi 설치하면 컨테이너가 무거워진다.

  1. 로컬로 수정할 파일 데리고 나와서
    docker cp webserver:/etc/nginx/nginx.conf /home/yji/nginx.conf

  2. 수정하고
    vim nginx.conf

  3. 다시 컨테이너 안으로 넣어준다.
    docker cp nginx.conf webserver:/etc/nginx/nginx.conf

yji@hostos1:~$ docker run -d -p 7777:80 --name webserver nginx:1.23.1-alpine
0fb501e036c13c8c5f58b4ec5e5a9f1d4278d643d3fd86cdc76df153e1b112f2

yji@hostos1:~$ docker cp webserver:/etc/nginx/nginx.conf /home/yji/nginx.conf

yji@hostos1:~$ ls
Desktop  Documents  Downloads  LABs  Music  nginx.conf  Pictures  Public  Templates  Videos

# 컨테이너에 vi 설치하지말고, 밖에서 수정한 후에 컨테인너 안으로 다시 넣어준다.
yji@hostos1:~$ vim nginx.conf

yji@hostos1:~$ docker cp nginx.conf webserver:/etc/nginx/nginx.conf
# Host의 현재 디렉터리에 있는 local.txt 파일을 text container의 /tmp/local.txt로 복사
docker cp 

docker diff

useradd 명령어는 많은 파일을 건드린다...~

C : (change) update, delete

docker commit

컨테이너는 Read/Write 환경 > 이걸 이미지로 만들자 .

yji@hostos1:~/LABs/nginx-test$ docker run -it --name webserver4 -d -p 8004:80 2214yj/myweb:3.0

이미지 생성 방법 2가지

  1. Dockerfile : docker build
  2. Container : docker commit ..!! (⭐⭐⭐ 절대 기존의 이미지를 수정할 수는 없다. 항상 새로운 이미지를 만드는 것이다 ! 이미지는 불변 ! )

메모장

  • docker image 다운 받을 때 docker pull python 이런 식으로 하지말자. :lastest 버전은 용량이 크다.
    따라서, docker hub에서 image 검색 후 경량화된 버전을 다운 받자

  • python = 모듈화가 잘 되어있다.
    1) 일반 프로그래밍
    2) 웹 프로그래밍(socket)

컨테이너는 라우터로 도커0 (172.~) 이거 사용 중 ?

docker exec : 작업
docker attach : 간단한 로그 조회

# attach는 bash 없어도 접속 가능
yji@hostos1:~$ docker attach mycent
profile
안녕하세요 😄

0개의 댓글