컨테이너 : All Denied
0) 개발팀 요청 -> 분석 -> OS, Package, ENV ... -> 작업 계획서 작성
1) Dockerfile 작성 -> ⭐ build (build 과정 잘 보기) -> 빌드 성공과 실패 확인
2) docker run 컨테이너 테스트
3) 공유
- Registry -> public / private -> push - source -> github -> CD
4) 개발팀 활용 -> 2번 서버에서 테스트 (우리는 짝궁끼리 ~)
Dockerfile 작성 > build > docker run >
[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
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 > ??
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
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
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' , '-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
python & flask를 이용한 간단한 웹 서비스 배포
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
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":[]}
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
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
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/
yji@hostos1:~$ sudo cat /nexus-data/admin.password
[sudo] password for yji:
cc3d08c0-6491-4772-b5ce-e325c64c1f06
다음 나오면 Enabled (일단은 !)
2가지 설정할거다.
하나는 저장소 용도, 하나는 proxy 형태 구성
save 클릭
proxy 용도로 쓸 서버
이제 기능 추가를 해야한다.
docker(hosted)클릭
proxy
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
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
# 브라우저에 접속
볼륨은 해당 애플리케이션의 소스 경로에 잡는다.
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단계
로그인
태그
푸시
🐳 📕 ⭐ 📔 💭 🤔 ✍