IaC(Infrastructure as Code, 코드형 인프라)
os에서 command 하나하나를 치지 않고, 코드로 만들어서 사용한다.
개발팀의 요청
개발팀의 요청을 분석한다. (OS, Package, ENV(환경변수), ...)
이를 통해 작업 계획서를 작성한다.
Dockerfile 작성
작성을 하고, build를 수행한다.
build 성공이 되어도 이미지가 잘못 만들어질 수 있다.
docker run 컨테이너 테스트
공유
1) Registry (public / private)
2) source (github는 CD가 가능)
개발팀 활용
2번 서버에서 테스트한다.
이후 변경이 발생하면 v1.0을 v1.1로 새로 push 하도록 지시한다.
: 베이스 image 지정(image:tag, OS)
ex) FROM ubuntu:14.04
: Dockerfile 작성자 저장
: 라벨 설정(설명, key=value)
이 이미지는 무엇을 만드는 것인지 알려준다.
: linux 명령어 실행(설치)
image build 시에 동작한다.
: 데몬 실행
container 실행 시에 동작한다. 데몬은 동적인 컨테이너에서 실행되어야 하기 때문이다.
거의 Dockerfile의 마지막에 들어간다.
: 데몬 실행, 변수 실행, arg 실행
container 실행 시 동작할 변수
arg에 따라서 실행하는 것이 달라질 때 사용한다.
: 노출(open)될 포트 export
개수 제한이 따로 없다.
: 내부 환경변수 설정
: 파일 및 디렉터리 추가(복사)
URL, 압축파일(tar, tar.gz 자동 해제 기능)
: 파일 복사
host에서 image에 저장
: 볼륨 마운트(directory)
host와 공유할 디렉터리
: 사용자 설정(useradd와 동일하다)
: 작업 디렉터리 지정
container에서 bash로 접근시 시작경로.
image 내에서 cd 역할을 한다.
kevin@hostos1:~$ cd LABs/
## appimage 디렉터리 생성
kevin@hostos1:~/LABs$ mkdir appimage
## nginx-test에 있는 index.html을 appimage로 복사
kevin@hostos1:~/LABs$ cd nginx-test/
kevin@hostos1:~/LABs/nginx-test$ ls
Dockerfile docker_logo.png index2.html index.html
kevin@hostos1:~/LABs/nginx-test$ cp index.html ../appimage/
kevin@hostos1:~/LABs/nginx-test$ cd ../appimage/
kevin@hostos1:~/LABs/appimage$ ls
index.html
## Dockerfile 생성
kevin@hostos1:~/LABs/appimage$ vi Dockerfile_nginx
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y -q nginx
COPY index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
## Dockerfile build
kevin@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 update && apt-get install -y -q nginx
---> Running in 324829913abf
Step 3/5 : COPY index.html /var/www/html/
---> c88285533cde
Step 4/5 : EXPOSE 80
---> Running in 84c54e587b99
Removing intermediate container 84c54e587b99
---> fe3d7bfb8b96
Step 5/5 : CMD ["nginx", "-g", "daemon off;"]
---> Running in 096dfa117915
Removing intermediate container 096dfa117915
---> 722a5db61bda
Successfully built 722a5db61bda
Successfully tagged webapp:1.0
## 이미지 생성 확인
kevin@hostos1:~/LABs/appimage$ docker images | grep webapp
## Dockerfile 명령어 확인
kevin@hostos1:~/LABs/appimage$ docker image history webapp:1.0
## 컨테이너 실행해서 확인
kevin@hostos1:~/LABs/appimage$ docker run -it -d --name webapp_test1 -p 8009:80 webapp:1.0
## docker hub login
kevin@hostos1:~/LABs/appimage$ docker login
## 내 레포지토리에 올리기
kevin@hostos1:~/LABs/appimage$ docker tag webapp:1.0 oeckikekk/webapp:1.0
kevin@hostos1:~/LABs/appimage$ docker push oeckikekk/webapp:1.0
## 상대방꺼 가져오기
kevin@hostos1:~/LABs/appimage$ docker pull jjy9922/webapp:1.0
이미지를 만들때 컨테이너 <-> 이미지 왔다갔다 하면서 만들어진다.
Step 1/5 : FROM ubuntu:18.04
---> 35b3f4f76a24 --> image id
Step 2/5 : RUN apt-get update && apt-get install -y -q nginx
---> Running in 324829913abf --> container id
Step 3/5 : COPY index.html /var/www/html/
---> c88285533cde --> docker commit으로 다시 image화 시킨다.
Step 4/5 : EXPOSE 80
---> Running in 84c54e587b99
Removing intermediate container 84c54e587b99
---> fe3d7bfb8b96
Step 5/5 : CMD ["nginx", "-g", "daemon off;"]
---> Running in 096dfa117915
Removing intermediate container 096dfa117915
---> 722a5db61bda
Successfully built 722a5db61bda
Successfully tagged webapp:1.0
## apache 디렉터리 생성
kevin@hostos1:~/LABs$ mkdir apache
## index.html 복사해오기
kevin@hostos1:~/LABs$ cd appimage
kevin@hostos1:~/LABs/appimage$ cp index.html ../apache/
kevin@hostos1:~/LABs/appimage$ cd ../apache/
kevin@hostos1:~/LABs/apache$ ls
index.html
## Dockerfile 생성
kevin@hostos1:~/LABs/apache$ vi Dockerfile_http
FROM ubuntu:14.04
MAINTAINER "soyeon <no02031@naver.com>"
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
## Dockerfile build
kevin@hostos1:~/LABs/apache$ docker build -f Dockerfile_http -t webapp:2.0 .
## 컨테이너 실행으로 확인
kevin@hostos1:~/LABs/apache$ docker run -d -P --name myapacheserver webapp:2.0
kevin@hostos1:~/LABs/apache$ docker port myapacheserver
80/tcp -> 0.0.0.0:49153
80/tcp -> :::49153
## http://192.168.56.101:49153으로 접속
## 내 docker hub에 올리기
kevin@hostos1:~/LABs/appimage$ docker login
kevin@hostos1:~/LABs/appimage$ docker tag webapp:2.0 oeckikekk/webapp:2.0
kevin@hostos1:~/LABs/appimage$ docker push oeckikekk/webapp:2.0
DOCKER_BUILDKIT
기본값은 0. 1로 하면 다르게 보인다.
## 압축 소스 받기
kevin@hostos1:~/LABs$ git clone https://github.com/brayanlee/webapp.git
kevin@hostos1:~/LABs$ cd webapp/
kevin@hostos1:~/LABs/webapp$ ls
webapp.tar.gz
## Dockerfile 생성
kevin@hostos1:~/LABs/webapp$ vi Dockerfile_web
FROM ubuntu:14.04
MAINTAINER "soyeon <no02031@naver.com>"
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
## Dockerfile build
kevin@hostos1:~/LABs/webapp$ DOCKER_BUILDKIT=1 docker build -f Dockerfile_web -t webapp:3.0 .
## container 실행
kevin@hostos1:~/LABs/webapp$ docker run -d -p 8181:80 --name=myweb4 webapp:3.0
## container에 들어가서 ADD에 의해 자동 압축 해제된 것 확인
kevin@hostos1:~/LABs/webapp$ docker exec -it myweb4 bash
root@9c05a7479d52:/var/www/html# ls
css index.html pngs
## http://192.168.56.101:8181/ 접속해서 확인
## 내 docker hub에 올리기
kevin@hostos1:~/LABs/appimage$ docker login
kevin@hostos1:~/LABs/appimage$ docker tag webapp:3.0 oeckikekk/webapp:3.0
kevin@hostos1:~/LABs/appimage$ docker push oeckikekk/webapp:3.0
: Go + scratch
다단계 빌드(multi-stage builds)활용한 웹 서비스 개발 환경 요청
두가지 언어를 연동한 인프라 환경(image) 개발 구성
## devteam_go 디렉터리 생성
kevin@hostos1:~/LABs$ mkdir devteam_go && cd $_
## gostart.go 생성
kevin@hostos1:~/LABs/devteam_go$ vi gostart.go
## Dockerfile 생성
kevin@hostos1:~/LABs/devteam_go$ vi Dockerfile
FROM golang:1.15-alpine3.12 AS gobuilder-stage
MAINTAINER soyeon <no02031@naver.com>
LABEL "purpose"="Service Deployment using Multi-stage builds."
WORKDIR /usr/src/goapp
COPY gostart.go .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /usr/local/bin/gostart
FROM scratch AS runtime-stage
COPY --from=gobuilder-stage /usr/local/bin/gostart /usr/local/bin/gostart
CMD ["/usr/local/bin/gostart"]
## Dockerfile build
kevin@hostos1:~/LABs/devteam_go$ DOCKER_BUILDKIT=1 docker build -t goapp:1.0 .
## container 실행
kevin@hostos1:~/LABs/devteam_go$ docker run --name goapp-deploy \
> -p 9090:9090 -d \
> -h goapp-container \
> goapp:1.0
## docker container 조회
kevin@hostos1:~/LABs/devteam_go$ curl localhost:9090
## http://192.168.56.101:9090/ 접속해서 확인
## 내 docker hub에 올리기
kevin@hostos1:~/LABs/appimage$ docker login
kevin@hostos1:~/LABs/appimage$ docker tag goapp:1.0 oeckikekk/goapp:1.0
kevin@hostos1:~/LABs/appimage$ docker push oeckikekk/goapp:1.0
## py_flask 디렉터리 생성
kevin@hostos1:~/LABs$ mkdir py_flask && cd $_
## Dockerfile 생성
kevin@hostos1:~/LABs/py_flask$ vi 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"]
## py_flask 안에 app 디렉터리 생성
kevin@hostos1:~/LABs/py_flask$ mkdir app && cd $_
## 파일 생성
kevin@hostos1:~/LABs/py_flask/app$ vi py_app.py
kevin@hostos1:~/LABs/py_flask/app$ vi requirements.txt
## dockerignore 생성
kevin@hostos1:~/LABs/py_flask/app$ cd ..
kevin@hostos1:~/LABs/py_flask$ vi .dockerignore
Dockerfile
## tree로 확인
kevin@hostos1:~/LABs/py_flask$ tree -a
.
├── app
│ ├── py_app.py
│ └── requirements.txt
├── Dockerfile
└── .dockerignore
## Dockerfile build
kevin@hostos1:~/LABs/py_flask$ DOCKER_BUILDKIT=1 docker build -t py_flask:1.0 .
## container 실행
kevin@hostos1:~/LABs/py_flask$ docker run -it -p 9000:9000 \
> -v ${PWD}/app:/py_app/app py_flask:1.0
## http://192.168.56.101:9000/ 접속해서 확인
## 내 docker hub에 올리기
kevin@hostos1:~/LABs/appimage$ docker login
kevin@hostos1:~/LABs/appimage$ docker tag py_flask:1.0 oeckikekk/py_flask:1.0
kevin@hostos1:~/LABs/appimage$ docker push oeckikekk/py_flask:1.0
kevin@hostos1:~/LABs$ docker pull registry
kevin@hostos1:~/LABs$ docker pull hyper/docker-registry-web
## hostos1, 2에 모두 설정해야 한다
kevin@hostos1:~$ docker info
...
Insecure Registries:
127.0.0.0/8
...
kevin@hostos1:~$ sudo vi /etc/init.d/docker
31 DOCKER_OPTS=--insecure-registry 192.168.56.101:5000
kevin@hostos1:~$ sudo vi /etc/docker/daemon.json
{ "insecure-registries": ["192.168.56.101:5000"] }
## 서비스 재시작
kevin@hostos1:~$ sudo systemctl restart docker.service
kevin@hostos1:~$ sudo systemctl status docker.service
## 새로운 것이 생겼다.
kevin@hostos1:~$ docker info
Insecure Registries:
192.168.56.101:5000
127.0.0.0/8
kevin@hostos1:~$ docker run -d \
> -v /home/kevin/registry_data:/var/lib/registry \
> -p 5000:5000 \
> --restart=always \
> --name=local-registry \
> registry
kevin@hostos1:~$ docker ps
kevin@hostos1:~$ ps -ef | grep b8ba17318e66
## 2번 서버에서도 나와야 한다.
kevin@hostos1:~$ curl -XGET http://192.168.56.101:5000/v2/_catalog
{"repositories":[]}
## image tag 설정
kevin@hostos1:~$ docker image tag myweb:1.0 192.168.56.101:5000/myweb:1.0
kevin@hostos1:~$ docker image tag phpserver:1.0 192.168.56.101:5000/phpserver:1.0
kevin@hostos1:~$ docker image tag goapp:1.0 192.168.56.101:5000/goapp:1.0
kevin@hostos1:~$ docker images
## private registry에 upload
kevin@hostos1:~$ docker push 192.168.56.101:5000/goapp:1.0
kevin@hostos1:~$ docker push 192.168.56.101:5000/phpserver:1.0
kevin@hostos1:~$ docker push 192.168.56.101:5000/myweb:1.0
## repositories 조회
kevin@hostos1:~$ curl -X GET http://192.168.56.101:5000/v2/_catalog
{"repositories":["goapp","myweb","phpserver"]}
## tag 조회
kevin@hostos1:~$ curl -X GET http://192.168.56.101:5000/v2/myweb/tags/list
{"name":"myweb","tags":["1.0"]}
kevin@hostos1:~$ curl -X GET http://192.168.56.101:5000/v2/goapp/tags/list
{"name":"goapp","tags":["1.0"]}
## 2번 서버에서 수행
## private registry에서 download(pull) 후 container start
kevin@hostos2:~$ docker pull 192.168.56.101:5000/myweb:1.0
kevin@hostos2:~$ docker image tag 192.168.56.101:5000/myweb:1.0 dev_http:1.1
kevin@hostos2:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.56.101:5000/myweb 1.0 6e7384c06f2a 7 days ago 23.6MB
dev_http 1.1 6e7384c06f2a 7 days ago 23.6MB
kevin@hostos2:~$ docker run -d -p 8100:80 --name myweb-server dev_http:1.1
## link로 web-registry와 local-registry 붙이기
kevin@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
## http://192.168.56.101:9090/ 접속해서 확인할 수 있다.
: http://192.168.56.101:9090/ 접속 확인
## 디렉터리 만들고 소유권 넘기기
kevin@hostos1:~$ sudo mkdir /nexus-data
kevin@hostos1:~$ sudo chown -R kevin.kevin /nexus-data
kevin@hostos1:~$ sudo ls -l /
...
drwxr-xr-x 2 kevin kevin 4096 9월 16 15:15 nexus-data
...
## image pull
kevin@hostos1:~$ docker pull sonatype/nexus3
## image history 확인
kevin@hostos1:~$ docker image history sonatype/nexus3:latest
## USER가 지정되어 있으면 run 할 때 -u 옵션을 꼭 붙여야 한다.
kevin@hostos1:~$ docker run -d --name=nexus-registry \
> -p 5000:5000 -p 8081:8081 \
> -v /nexus-data:/nexus-data \
> -u root \
> --restart=always \
> sonatype/nexus3
## http://192.168.56.101:8081/ 접속해서 확인
## 암호 확인
kevin@hostos1:~$ sudo cat /nexus-data/admin.password
비밀번호 알아내서 로그인 하기
Blob Stores 클릭
Create Blob Store 클릭
1) docker-hosted
2) docker-hub
Repositories 클릭
1) create repositoy - docker(hosted)
2) create repositoy - docker(proxy)
Realms 클릭
Docker Bearer Token 넣기
## nexus repositoy login
kevin@hostos1:~$ docker login http://192.168.56.101:5000
## image push
kevin@hostos1:~$ docker push 192.168.56.101:5000/phpserver:1.0
## 2번 host에서 다운로드 받기
kevin@hostos2:~$ docker pull 192.168.56.101:5000/phpserver:1.0
## cent_http 디렉터리 만들기
kevin@hostos1:~$ cd LABs/
kevin@hostos1:~/LABs$ mkdir cent_http && cd $_
## Dockerfile 생성
kevin@hostos1:~/LABs/cent_http$ vi Dockerfile
FROM centos:7
LABEL maintainer "DataStory Hub webserver"
MAINTAINER http2.1 no02031@naver.com
RUN yum -y update
RUN yum -y install httpd
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
## Dockerfile build
kevin@hostos1:~/LABs/cent_http$ docker build -t webserver:2.1 .
## container 생성
kevin@hostos1:~/LABs/cent_http$ docker run -it -d -p 9999:80 webserver:2.1
## http://192.168.56.101:9999/ 접속해서 확인
## tag 붙이기
kevin@hostos1:~/LABs/cent_http$ docker tag webserver:2.1 192.168.56.101:5000/httpd:2.1
## repository에 login 하기
kevin@hostos1:~/LABs/cent_http$ docker login http://192.168.56.101:5000
## 이미지 push
kevin@hostos1:~/LABs/cent_http$ docker push 192.168.56.101:5000/httpd:2.1
## 확인
kevin@hostos1:~/LABs/cent_http$ curl -X GET http://192.168.56.101:5000/v2/_catalog
## nexus browsw에서 image가 생겼는지 확인한다
## 2번 서버에서 login
kevin@hostos2:~$ docker login 192.168.56.101:5000
## image pull
kevin@hostos2:~$ docker pull 192.168.56.101:5000/httpd:2.1
## container 생성
kevin@hostos2:~$ docker run -it -d -p 9999:80 192.168.56.101:5000/httpd:2.1
## http://192.168.56.102:9999/ 접속해서 확인
## static_web 디렉터리 생성
kevin@hostos1:~/LABs$ mkdir static_web
## 파일들을 tar.gz으로 묶는다.
kevin@hostos1:~/LABs/staticweb$ tar -zcvf static_web.tar.gz error.html index.html script.js style.css
kevin@hostos1:~/LABs/static_web$ tar tvzf static_web.tar.gz
-rw-rw-r-- kevin/kevin 3323 2021-01-26 15:24 error.html
-rw-rw-r-- kevin/kevin 9849 2022-09-16 16:46 index.html
-rw-rw-r-- kevin/kevin 2077 2020-06-17 11:36 script.js
-rw-rw-r-- kevin/kevin 3359 2020-06-17 11:36 style.css
## cd
kevin@hostos1:~/LABs/staticweb$ mv static_web.tar.gz ../static_web/
kevin@hostos1:~/LABs/staticweb$ cd ../static_web
## Dockerfile 생성
kevin@hostos1:~/LABs/static_web$ vi Dockerfile
FROM ubuntu:14.04
MAINTAINER "soyeon <no02031@naver.com>"
LABEL "purpose"="private registry 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/*
ADD static_web.tar.gz /var/www/html
WORKDIR /var/www/html
EXPOSE 80
CMD apachectl -D FOREGROUND
## Dockerfile build
kevin@hostos1:~/LABs/static_web$ docker build -t staticweb:1.0 .
## container 실행
kevin@hostos1:~/LABs/static_web$ docker run -d -P --name statictest staticweb:1.0
## port 확인
kevin@hostos1:~/LABs/static_web$ docker port statictest
80/tcp -> 0.0.0.0:49153
80/tcp -> :::49153
## http://192.168.56.101:49153으로 접속
## nexus repository에 올리기
kevin@hostos1:~/LABs/static_web$ docker tag staticweb:1.0 192.168.56.101:5000/staticweb:1.0
kevin@hostos1:~/LABs/static_web$ docker login http://192.168.56.101:5000
kevin@hostos1:~/LABs/static_web$ docker push 192.168.56.101:5000/staticweb:1.0
## 내 docker hub에 올리기
kevin@hostos1:~/LABs/appimage$ docker login
kevin@hostos1:~/LABs/appimage$ docker tag staticweb:1.0 oeckikekk/staticweb:1.0
kevin@hostos1:~/LABs/appimage$ docker push oeckikekk/staticweb:1.0