0916(금) - 도커 6

Yuri JI·2022년 9월 16일
0

Kakao Cloud School

목록 보기
11/27

📕 Dockerfile

컨테이너 : All Denied

📔 Docker image 생성 작업 순서

0) 개발팀 요청 -> 분석 -> OS, Package, ENV ... -> 작업 계획서 작성
1) Dockerfile 작성 -> ⭐ build (build 과정 잘 보기) -> 빌드 성공과 실패 확인
2) docker run 컨테이너 테스트
3) 공유

   - Registry -> public / private -> push
   - source -> github -> CD

4) 개발팀 활용 -> 2번 서버에서 테스트 (우리는 짝궁끼리 ~)

  • 이후 변경이 발생하면 -> v1.0을 v1.1로 새로 push 하도록 제시.

Dockerfile 작성 > build > docker run >

📔 Dockerfile 명령어

Node.js와 npm(Node Packeaged Manager) 구축 사례 실습 -> IaC

[Node.js] --- [npm (node의 백엔드 느낌] --- MongoDB

RUN mkdir -p /usr/

FROM ubuntu:14.04
RUN apt -y update
RUN apt -y install python:3.8-alpine3.14

---
# 터미널 
docker build -t my-python:1.0 .

실습

mkdir appimage && cd $_
vim Dockerfile_nginx

### Dockerfile_nginx 작성 
FROM ubuntu:18.04
RUN apt-get -y update && apt-get -y install -q nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]]


## 이미지 생성 
yji@hostos1:~/LABs/appimage$ docker build -f Dockerfile_nginx -t webapp:1.0 .

Step 1/5 : FROM ubuntu:18.04
 ---> 35b3f4f76a24
Step 2/5 : RUN apt-get -y update && apt-get -y install -q nginx
Step 3/5 : COPY index.html /var/www/html/
 ---> 961e78436499
Step 4/5 : EXPOSE 80
 ---> Running in 7bc442c0c271
Removing intermediate container 7bc442c0c271
 ---> 75aaf52bb861
Step 5/5 : CMD ["nginx", "-g", "daemon off;"]]



## 생성된 이미지 확인 
yji@hostos1:~$ docker images | grep webapp:1.0


## 컨테이너 실행 
docker run -itd --name webapp_test1 -p 8009:80 webapp:1.0

# push
docker login
docker tag webapp:1.0 ur2e/webapp:1.0
docker push ur2e/webapp:1.0

# 2번 서버에서 (또는 짝궁이랑)
docker pull 2214yj/webapp:1.0
docker ruu -itd --name webapp_yeji -p 8009:80 2214yj/webapp:1.0

docker Step 설명


Step 1/5 : FROM ubuntu:18.04
 ---> 35b3f4f76a24 ⭐ 이미지 아이디 
 
Step 2/5 : RUN apt-get -y update && apt-get -y install -q nginx
----> Running in xxxxxxx ⭐ 컨테이너 아이디 

Step 3/5 : COPY index.html /var/www/html/
 ---> 961e78436499 ⭐ 다시 아이디 
 
Step 4/5 : EXPOSE 80
 ---> Running in 7bc442c0c271 ⭐ expose 하기위해 컨테이너를 또 띄워  
Removing intermediate container 7bc442c0c271
 ---> 75aaf52bb861  ⭐ 다시 이미지 
 
Step 5/5 : CMD ["nginx", "-g", "daemon off;"]]
⭐ 이게 최종 이미지 ! 

: 이거 최종 이미지 번호 확인하자 ~ 
docker image inspect >  ?? 

Dockerfile 정리

📔 실습 2. Apache webserver 구축 (수동 build)

Ubuntu 기반의 base image 생성
-> Dev-Team으로부터 ubuntu 기반의 php 웹 서비스 개발환경 요청을 받음
아파치 웹 서버 설치를 위한 ubuntu container를 올리고, apache+php를 설치한다.
그 다음
docker commit 을 이용해 컨테이너를 이미지로 생성

새로생긴 이미지를 가지고 run을 해도 안 떠
왜 ? apache service를 시작 안해서 apache 데몬이 없음 !
apache2를 수동으로 켜야한다.

근데 수동 싫어 !!
그러면
새로생긴 이미지로 도커파일을 다시 작성한다.
FROM 본인ID/myapp:4.0 !

--> 🐳 우리는 Dockerfile에서 이미지를 만들어서 컨테이너를 돌려보자.
ubuntu 이미지에 apache를 설치하고 CMD apachectl -D FOREGROUND 까지 실행해주면 이미지를 새로 빌드해도 apache가 바로 실행된다. ! ( 직접 켜줄 필요없음)


yji@hostos1:~/LABs/apache2$ cat Dockerfile_http
FROM ubuntu:14.04
MAINTAINER "ur2e <ure1129@sookmyung.ac.kr>"
LABEL "purpose"="webserver practice"
RUN apt-get update && apt-get install apache2 -y && \
        apt-get clean -y && \
        apt-get autoremove -y && \
        rm -rfv /tmp/* /var/lib/apt/lists/* /var/tmp/*
WORKDIR /var/www/html
ADD index.html .
EXPOSE 80
⭐CMD apachectl -D FOREGROUND⭐



yji@hostos1:~/LABs/apache2$ docker build -f Dockerfile_http -t webappp:2.0 .


Step 1/8 : FROM ubuntu:14.04
 ---> 13b66b487594
Step 2/8 : MAINTAINER "ur2e <ure1129@sookmyung.ac.kr>"
 ---> Using cache
 ---> 3bc9439997f3
Step 3/8 : LABEL "purpose"="webserver practice"
 ---> Using cache
 ---> 1198b1737312
Step 4/8 : RUN apt-get update && apt-get install apache2 -y &&  apt-get clean -y &&     apt-get autoremove -y &&      rm -rfv /tmp/* /var/lib/apt/lists/* /var/tmp/*
 ---> Using cache
 ---> afb81e379e55
Step 5/8 : WORKDIR /var/www/html
 ---> Using cache
 ---> d4fe4013f32c
Step 6/8 : ADD index.html .
 ---> Using cache
 ---> 9e88e9db4b68
Step 7/8 : EXPOSE 80
 ---> Using cache
 ---> 694150867477
Step 8/8 : CMD apachectl -D FOREGROUND
 ---> Running in daa4c23fd589
Removing intermediate container daa4c23fd589
 ---> 8eeab8583271
Successfully built 8eeab8583271
Successfully tagged webappp:2.0



yji@hostos1:~/LABs/apache2$ docker run -d -P --name myapacheserver webappp:2.0
68fc5a2ce839a828a22ae2d428daa89985066ea25429daba109ab6270783b23d


yji@hostos1:~/LABs/apache2$ docker port myapacheserver
80/tcp -> 0.0.0.0:49155
80/tcp -> :::49155

# 크롬으로 웹서비스 연결 
http://192.168.56.101:49155

📔 실습 3 DEV팀에서 제공받은 압축 소스를 이용한 image build

git clone https://github.com/brayanlee/webapp.git
cd webapp

yji@hostos1:~/LABs/webapp$ cat Dockerfile_web
FROM ubuntu:14.04
MAINTAINER "yuri.ji <ure1129@sookmyung.ac.kr>"
LABEL "purpose"="webserver practice"
RUN apt-get update && apt-get -y install apache2 \
                                        vim \
                                        curl
ADD webapp.tar.gz /var/www/html
WORKDIR /var/www/html
EXPOSE 80
CMD /usr/sbin/apache2ctl -D FOREGROUND

yji@hostos1:~/LABs/webapp$ DOCKER_BUILDKIT=1 docker build -f Dockerfile_web -t webapp:3.0 .


yji@hostos1:~/LABs/webapp$ docker run -d -p 8181:80 --name=myweb4 webapp:3.0
91cc389d23c89e6d5b9db8cf501a8139535a0013bda6369e40075aeed1418f6a

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

root@91cc389d23c8:/var/www/html# ls
css  index.html  pngs ✍ ADD에 의해서 자동으로 압축 해제된 것을 확인할 수 있다. 


# 자신의 hub.docker.com에 push하기 
yji@hostos1:~/LABs/webapp$ docker tag webapp:3.0 ur2e/webapp:3.0
yji@hostos1:~/LABs/webapp$ docker push ur2e/webapp:3.0

실습 4) Go lang 활용한 screatch 서비스 환경 요청

  • Go + screatch, 다단계 빌드(multi-stage build)활용한 웹 서비스 개발 환경 요청
  • 두 가지 언어를 연동한 인프라 환경(image) 개발 구성

go를 가진 이미지, 스크래치를 가진 이미지
stage = FROM

hostos1 -> hosts2 : scp 이용
COPY --from=gobuilder-stage A B : A = 스크래치영역 B는 go 영역

docker image inspect goapp:1.0
docker image history goapp:1.0
docker image inspect goapp:1.0

-> 하면 마지막엔 스크래치만 살아남는다.. 이게 장점..

# 이미지 생성 
yji@hostos1:~/LABs/devteam_go$ DOCKER_BUILDKIT=1 docker build -t goapp:1.0 .

docker run --name goapp -p 9090:9090 -d goapp:1.0


yji@hostos1:~/LABs/devteam_go$ docker inspect goapp | grep -i PORT
            "PortBindings": {
                        "HostPort": "9090"
            "PublishAllPorts": false,
            "ExposedPorts": {
            "Ports": {
                        "HostPort": "9090"
                        "HostPort": "9090"

📔 포트 -p 옵션 대신

  • EXPOSE는 호스트와 연결만 할 뿐 외부에 노출은 되지 않습니다. 포트를 외부에 노출하려면 docker run 명령의 -p, -P 옵션을 사용해야 합니다.

'-p' , '-P' 차이

-p, --publish list Publish a container's port(s) to the host

-P, --publish-all Publish all exposed ports to random ports

yji@hostos1:~/LABs/devteam_go$ docker run --name goapp -P --expose=9090 -d goapp:1.0
5969842896a6e6aaf8cae5d2df7fca8129bbb0a95410f010ef37ba721ddfab52
yji@hostos1:~/LABs/devteam_go$ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED             STATUS             PORTS                                         NAMES
5969842896a6   goapp:1.0     "/usr/local/bin/gost…"   3 seconds ago       Up 1 second        0.0.0.0:49156->9090/tcp, :::49156->9090/tcp   goapp

📔 실습 5) flask를 이용한 마이크로 웹 프레임워크 구성

python & flask를 이용한 간단한 웹 서비스 배포

✍ dockerignore

Dockerfile은 만들 때 필요한거지 run하는데 필요한 것이 아님. -> .dockerignore에 Dockerfile 넣으면 이미지 만들 때 제외된다.

# 다음 구조대로 작성 
yji@hostos1:~/LABs/devteam_go/py_flask$ tree -a
.
├── app
│   ├── py_app.py
│   └── requirements.txt
├── Dockerfile
└── .dockerignore



# app/py_app.py 저장 

# Dockerfile 작성 
yji@hostos1:~/LABs/devteam_go/py_flask$ cat Dockerfile
FROM python:3.8-alpine
RUN apk update && \
        apk add --no-cache \
        bash
RUN apk add --update build-base python3-dev py-pip
ENV LIBRARY_PATH=/lib:/usr/lib
EXPOSE 9000
WORKDIR /py_app
copy . /py_app
RUN pip install -r ./app/requirements.txt
ENTRYPOINT ["python"]
CMD ["./app/py_app.py"]


yji@hostos1:~/LABs/devteam_go/py_flask$ cat requirements.txt
Flask==2.1.0


yji@hostos1:~/LABs/devteam_go/py_flask$ cat .dockerignore
Dockerfile

# 이미지 생성 (py_flask:1.0)
yji@hostos1:~/LABs/devteam_go/py_flask$ DOCKER_BUILDKIT=1 docker build -t py_flask:1.0 .


# 컨테이너 실행 
yji@hostos1:~/LABs/devteam_go/py_flask$ docker run -it -p 9000:9000 \
> -v ${PWD}/app:/py_app/app py_flask:1.0

== 
 docker run -it -p 9000:9000 -v ${PWD}/app:/py_app/app py_flask:1.0
 
 
# 도커 허브에 이미지 올리기 
yji@hostos1:~$ docker tag py_flask:1.0 ur2e/py_flask:1.0
yji@hostos1:~$ docker push ur2e/py_flask:1.0

 


📔 private registry 구축(local registry)

  • 작업 순서
  1. "registry" image download
  2. Container registry 구성
  3. curl을 이용하여 접근확인 (text based)
  4. WEB UI container로 연동 (--link)
  5. Private registry에 push / pull test
1. sudo vim /etc/init.d/docker
31번째 줄DOCKER_OPTS=--insecure-registry 192.168.56.101:5000 추가

2. sudo vim /etc/docker/daemon.json 
{ "insecure-registries":["192.168.56.101:5000"] }

1번 서버와 2번 서버에 동일하게 작성한다.

3. sudo systemctl restart docker.service
4.systemctl status docker.service # active running 인지 확인 

5. docker info
Insecure Registries:
  192.168.56.101:5000 #이거 뜨면 성공 
  127.0.0.0/8


##### docker image history registry
EXPOSE 5000  💭💭 아 5000번 포트가 열려있구나.

NAT + NAPT를 구현하는게 PROXY

yji@hostos1:~$ docker run -d \
> -v /home/yji/registry_data:/var/lib/registry \
docker: invalid reference format.
See 'docker run --help'.
yji@hostos1:~$ docker run -d -v /home/yji/registry_data:/var/lib/registry \
> -p 5000:5000 \
> --restart=always \
> --name=local-registry \
> registry
c4ccdc1168e7c4f56f63615e0bf926812340259d3245b75906f743973254fa1d
dockeryji@hostos1:~$ docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
c4ccdc1168e7   registry   "/entrypoint.sh /etc…"   4 seconds ago   Up 2 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   local-registry


# 개인 registry 조회
yji@hostos1:~$ curl -XGET http://192.168.56.101:5000/v2/_catalog
{"repositories":[]}

1번 서버에서 올린 것을 2번 서버에서 조회하기

yji@hostos1:~$ docker image tag myweb:1.0 192.168.56.101:5000/myweb:1.0

yji@hostos1:~$ docker image tag phpserver:1.0 192.168.56.101:5000/phpserver:1.0

yji@hostos1:~$ docker image tag goapp:1.0 192.168.56.101:5000/goapp:1.0

yji@hostos1:~$ docker push 192.168.56.101:5000/myweb:1.0

yji@hostos1:~$ docker push 192.168.56.101:5000/phpserver:1.0

yji@hostos1:~$   docker push 192.168.56.101:5000/goapp:1.0

### 1번 서버에서 조회 
yji@hostos1:~$ curl -XGET http://192.168.56.101:5000/v2/_catalog
{"repositories":["goapp","myweb","phpserver"]}

### 2번 서버에서 조회 
yji@hostos2:~$ curl -XGET http://192.168.56.101:5000/v2/_catalog
{"repositories":["goapp","myweb","phpserver"]}

### 2번 서버에서 1번 서버에서 업로드한 개인 registry의 이미지 받아오기 
docker pull 192.168.56.101:5000/myweb:1.0

# 받아온 이미지 확인 
docker images | grep myweb
192.168.56.101:5000/myweb   1.0            38fe5550c627   7 days ago      23.6MB

# 받아온 이미지 태그하기
yji@hostos2:~$ docker image tag 192.168.56.101:5000/myweb:1.0 dev_http:1.1
yji@hostos2:~$ docker images | grep dev_http
dev_http                    1.1            38fe5550c627   7 days ago      23.6MB

# 태그이름으로 컨테이너 실행 
yji@hostos2:~$ docker run -d -p 8100:80 --name myweb-server dev_http:1.1
da4fe444e02155762dc13f30a8daf1f2a0771fc8b806007885d886c0484f25bb

docker registry

yji@hostos1:~$ docker run -itd -p 9090:8080 --name=web-registry -e REGISTRY_URL=http://192.168.56.101:5000/v2 -e REGISTRY_NAME=192.168.56.101:5000 --restart=always --link=local-registry hyper/docker-registry-web
29c6e8c7f266ba12231d3d275a07fedce0c69ddfa9d0471335e7ea23e9aea850
yji@hostos1:~$ docker ps
CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                       NAMES
29c6e8c7f266   hyper/docker-registry-web   "start.sh"               8 seconds ago    Up 7 seconds    0.0.0.0:9090->8080/tcp, :::9090->8080/tcp   web-registry

📕 nexus 설치 (private registry)

docker pull sonatype/nexus3

docker image history sonatype/nexus3
USER ->USER가 있으면 -user 가 꼭 있어야합니다. ⭐
EXPOSER -> 포트


yji@hostos1:~$ docker image history sonatype/nexus3
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
11ff0b1c5ab7   3 weeks ago   /bin/sh -c #(nop)  CMD ["/opt/sonatype/nexus…   0B
<missing>      3 weeks ago   /bin/sh -c #(nop)  ENV INSTALL4J_ADD_VM_PARA…   0B
<missing>      3 weeks ago   /bin/sh -c #(nop)  USER nexus                   0B
<missing>      3 weeks ago   /bin/sh -c #(nop)  EXPOSE 8081   
===


docker run -d --name=nexus-registry \
-p 5000:5000 -p 8081:8081 \
-v /nexus-data:/nexus-data \
-u root \
--restart=always \
sonatype/nexus3

#  vim /etc/docker/daemon.json
 "insecure-registries": ["192.168.5.205:5000"], 맨 윗줄에 추가 !

# 로컬 브라우저에서 접속 -> 느립니다 ! 사이트에 연결할 수 없음 떠도 기다리면 뜬다. 
http://192.168.56.101:8081/

sonatype 세팅

  1. 로그인 & 암호 변경

yji@hostos1:~$ sudo cat /nexus-data/admin.password
[sudo] password for yji:
cc3d08c0-6491-4772-b5ce-e325c64c1f06

다음 나오면 Enabled (일단은 !)

  1. 톱니바퀴 = 관리구성, 서버관리

2가지 설정할거다.
하나는 저장소 용도, 하나는 proxy 형태 구성

  1. Blob Stores

save 클릭

proxy 용도로 쓸 서버

이제 기능 추가를 해야한다.

docker(hosted)클릭

proxy


  • 보안

nexus? 에 로그인 하는 법

yji@hostos1:~$ docker login http://192.168.56.101:5000
Username: admin
Password: 1234
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

server 2에서 nexus에 올리기

docker login http://192.168.56.101:5000
Username: admin
Password:

docker tag 2214yj/myweb:1.0 192.168.56.101:5000/myweb:1.0

docker push 192.168.56.101:5000/myweb:1.0

이미지 결과 확인

실습

yji@hostos1:~$ cd LABs/

yji@hostos1:~/LABs$ mkdir cent_http && cd $_

yji@hostos1:~/LABs/cent_http$ vim Dockerfile

yji@hostos1:~/LABs/cent_http$ docker build -t webserver:2.1 .


docker images | grep webserver

docker tag webserver:2.1 192.168.56.101:5000/httpd:2.1

docker login http://192.168.56.101:5000
docker push 192.168.56.101:5000/httpd:2.1

curl -X GET http://192.168.56.101:5000/v2/_catalog
yji@hostos1:~/LABs/cent_http$ curl -X GET http://192.168.56.101:5000/v2/_catalog
{"repositories":["httpd","myweb","phpserver"]}

nexus 에서도 확인 가능

# 서버 2에서 pull 받아보기

마지막 실습

제공받은 웹 소스(static_web.zip)을 확인하고
index.html을 본인이름과 가상회사이름으로 변경

해당 소스를 참고하여 다음 요구사항에 맞는 Dockerfile 작성

# unzip static_web.zip
# index.html 파일 수정 
# tar.gz 묶음, 압축
# Dockerfile 작성 

 cat Dockerfile
 
FROM ubuntu:14.04
MAINTAINER "yuri.ji <ure1129@sookmyung.ac.kr>"
LABEL "purpose"="web hosting prac"

RUN apt-get -y update && apt-get -y install apache2

WORKDIR /var/www/html
ADD static_wbe.tar.gz /var/www/html
EXPOSE 80

CMD /usr/sbin/apache2ctl -D FOREGROUND


# docker build -t staticweb:1.0
# docker run -itd --name=web -p 8001:80 staticweb:1.0 

# 브라우저에서 http://192.168.56.101:8001/ 접속 

# Nexus private registry와 본인의 docker hub repostiroy에 push 
docker tag staticweb:1.0 192.168.56.101:5000/staticweb:1.0
docker push 192.168.56.101:5000/staticweb:1.0


# hostos2  에서 이미지 다운 받아오기 
docker pull 192.168.56.101:5000/staticweb:1.0
docker run -itd --name=web -p 8002:80 192.168.56.101:5000/staticweb:1.0

# docker hub에 이미지 push 
docker tag staticweb:1.0 ur2e/staticweb:1.0
docker push ur2e/staticweb:1.0

# 짝궁 이미지 dockerhub에서 받아오기 
docker pull 2214yj/apacheserver:1.0

# 짝궁 이미지 확인 
yji@hostos1:~/LABs/lab0916$ docker images | grep 2214yj
2214yj/apacheserver                 1.0             a05ed1c235dd   13 minutes ago   221MB
2214yj/myweb                        3.0             90ee264314e9   3 days ago       142MB

# 짝궁 이미지를 컨테이너로 띄우기 
yji@hostos1:~/LABs/lab0916$ docker run -d -p 8888:80 2214yj/apacheserver:1.0

# 브라우저에 접속

  • hostos1 -> Nexus registry에 push -> hostos2 pull -> run in hostos2

메모장

볼륨은 해당 애플리케이션의 소스 경로에 잡는다.

  • 컨테이너 프로세스로 보기
dockeryji@hostos1:~$ docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS                                       NAMES
c4ccdc1168e7   registry   "/entrypoint.sh /etc…"   4 seconds ago   Up 2 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp   local-registry
yji@hostos1:~$ sudo netstat -nlp | grep 5000
tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      2368/docker-proxy
tcp6       0      0 :::5000                 :::*                    LISTEN      2374/docker-proxy
yji@hostos1:~$ ps -ef | grep 2368
root        2368    2050  0 14:28 ?        00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 5000 -container-ip 172.17.0.2 -container-port 5000
yji         2478    1855  0 14:31 pts/0    00:00:00 grep --color=auto 2368

image push 3단계
로그인
태그
푸시

🐳 📕 ⭐ 📔 💭 🤔 ✍

profile
안녕하세요 😄

0개의 댓글