개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 1. Docker 요약 정리

nineDeveloper 2020. 8. 17.
728x90

참조: https://www.notion.so/96f6ed8a518b4245ab87dc8ffd669cbb?p=2c1ad78820f5409a874a8496d2bd100b

3 내가 원하는 이미지 찾기


3.1 도커 레지스트리

도커 레지스트리에는 사용자가 사용할 수 있도록 데이터베이스를 통해 Image를 제공해주고 있음
누구나 이미지를 만들어 푸시할 수 있으며 푸시된 이미지는 다른 사람들에게 공유 가능

3.3 도커 명령어로 검색

sudo docker search tomcat

3.4 도커 이미지 다운로드하기

sudo docker pull tomcat

3.5 로컬 시스템에 있는 도커 이미지 확인하기

sudo docker images

4 도커 라이프 사이클 이해하기


5 도커 라이프 사이클 명령어 실습


5.1 도커 이미지 다운로드와 삭제

sudo docker pull consol/tomcat-7.0
sudo docker rmi consol/tomcat-7.0

5.2 톰캣 컨테이너 생성

sudo docker run -d --name tc tomcat # 톰캣 생성 및 실행

5.3 실행중인 컨테이너 확인

sudo docker ps # 톰캣 컨테이너 확인
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f6e513b399a6        tomcat              "catalina.sh run"   27 seconds ago      Up 26 seconds       8080/tcp            tc

5.4 모든 컨테이너 확인

sudo docker ps -a # 모든 컨테이너 확인

5.5 컨테이너 중지

sudo docker stop f6e513b399a6 # 컨테이너 실행 중지
f6e513b399a6

5.6 컨테이너 삭제

sudo docker rm f6e513b399a6 # 컨테이너 삭제
f6e513b399a6

6 이미지 비밀: 레이어


6.1 레이어의 개념

왼쪽: 이미지 A를 지운다 하더라도 이미지 B에서 레이어 A, B, C를 사용하고 있기 때문에 지워지지 않음
오른쪽: 이미 존재하는 레이어 A, B는 새로 다운로드 받을 필요가 없음

6.2 도커 이미지 정보 확인

sudo docker pull nginx
sudo docker inspect nginx

6.3 도커 이미지 저장소 위치 확인

sudo docker info
sudo -i
cd /var/lib/docker/overlay2

6.4 레이어 저장소 확인

root@server1-VirtualBox:/var/lib/docker/overlay2# ls
0cc29ea5605872d9c8291673064e85b07160203fbf04b34eeeed899731361960 # 레이어 변경 사항 저장
615767e7221dbc99b8e441e35a88df5d74c911f2674ceaa28001388535e95be2 # 레이어 변경 사항 저장
9f3bb671f38d7f61f661af369d420cdedb195e4d623bdb6ba8e3b045f72e8d69 # 레이어 변경 사항 저장
l # 원본 레이어 저장

6.5 도커 용량 확인하기

du -sh /var/lib/docker/ #도커가 설치된 환경 용량 확인
2.0G    /var/lib/docker/

du -sh /var/lib/docker/image/ # 도커 이미지에 대한 정보 저장 디렉토리
2.7M    /var/lib/docker/image/

du -sh /var/lib/docker/overlay2/ # 도커 이미지의 파일 시스템이 사용되는 실제 디렉토리
2.0G    /var/lib/docker/overlay2/

du -sh /var/lib/docker/containers/ # 도커 컨테이너 정보 저장 디렉토리
136K    /var/lib/docker/containers/

7 도커의 유용한 명령어


7.1 포트포워딩으로 톰캣 실행하기

sudo docker run -d --name tc -p 80:8080 tomcat
firefox 127.0.0.1:80

7.2 컨테이너 내부 셸 실행

sudo docker exec -it tc /bin/bash

7.3 컨테이너 로그 확인

sudo docker logs tc # stdout, stderr

7.4 호스트 및 컨테이너 간 파일 복사

sudo docker cp <path> <to container>:<path>
sudo docker cp <from container>:<path> <path>
sudo docker cp <from container>:<path> <to container>:<path>

7.5 도커 컨테이너 모두 삭제

sudo docker stop `sudo docker ps -a -q`
sudo docker rm `sudo docker ps -a -q`

7.6 임시 컨테이너 생성

sudo docker run -d -p 80:8080 --rm --name tc tomcat 

8 도커 컨테이너 실행 연습문제


  1. 기존에 설치된 모든 컨테이너와 이미지 정지 및 삭제
  2. 도커 기능을 사용해 Jenkins 검색
  3. Jenkins를 사용하여 설치
  4. Jenkins 포트로 접속하여 웹 서비스 열기
  5. Jenkins의 초기 패스워드 찾아서 로그인하기

정답 및 해설

1. 기존에 설치된 모든 컨테이너와 이미지 정지 및 삭제

sudo docker stop `sudo docker ps -a -q`
sudo docker rm `sudo docker ps -a -q`
sudo docker rmi `sudo docker images -q`

2. 도커 기능을 사용해 Jenkins 검색

sudo docker search jenkins

3. Jenkins를 사용하여 설치

sudo docker pull jenkins
sudo docker inspect jenkins
sudo docker run -d -p 8080:8080 --name jk jenkins test

4. Jenkins 포트로 접속하여 웹 서비스 열기

firefox 127.0.0.1:8080
브라우저에 캐시가 남아있는 경우에는 ctl + shift + del

5. Jenkins의 초기 패스워드 찾아서 로그인하기

sudo docker exec -it jk cat /var/jenkins_home/secrets/initialAdminPassword
sudo docker logs jk

9 환경 변수 사용해 MySQL 서비스 구축하기


9.1 docker hub에서 mysql 검색

9.2 환경 변수 사용해 데이터 전달하기

$ docker run -d --name nx -e env_name=test1234 nginx
/# printenv env_name

9.3 MySQL 서비스 구축하기

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD='!qhdkscjfwj@' -d mysql
$ docker exec -it some-mysql mysql
password: !qhdkscjfwj@
mysql>

10 볼륨 마운트하여 Jupyter LAB 서비스 구축


10.1 docker hub에서 Jupyter notebook 검색

10.2 볼륨 마운트 옵션 사용해 로컬 파일 공유하기

  • 명령어 형식
docker run -v <호스트 경로>:<컨테이너 내 경로>:<권한> # /tmp:home/user:ro
  • 권한의 종류
    • ro: 읽기 전용
    • rw: 읽기 및 쓰기

nginx로 볼륨마운트하기

sudo docker run -d -p 80:80 --rm -v /var/www:/usr/share/nginx/html:ro nginx
curl 127.0.0.1
echo 1234 > /var/www/index.html
curl 127.0.0.1

10.3 데이터 분석가를 위한 Jupyter LAB 환경 구축하기

현재 디렉토리를 사용하여 notebook 컨테이너 실행

mkdir ~/jupyternotebook
chmod 777 ~/jupyternotebook
cd ~/jupyternotebook
sudo docker run --rm -p 8080:8888 -e JUPYTER_ENABLE_LAB=yes -v "$PWD":/home/jovyan/work:rw jupyter/datascience-notebook:9b06df75e445

실행하면 나오는 링크를 통해 접속한다.

http://127.0.0.1:8080/token=??????????????????

주피터랩 서버로 접속해서 work으로 접속하고 새 노트북 생성하고 코드를 작성한다.

print("Hello Python Jupyter Notebook")

타이핑 후 shift + Enter를 누르면 실행한다

11 직접 도커 이미지 빌드하기


11.1 도커 빌드할 프로그램 준비

python를 사용해 단순한 서비스를 시작 작성한다. 다음 파일을 작성하여 test_server.py로 저장한다.

# test_server.py
import socket

with socket.socket() as s:
  s.bind(("0.0.0.0", 12345))
  s.listen()
  print("server is started")
  conn, addr = s.accept()
  # conn 클라이언트와 통신할 소켓
  # addr 클라이언트의 정보가 들어있음
  with conn:
    print("Connected by", addr)
    while True:
      data = conn.recv(1024)
      if not data: break
      conn.sendall(data)
python3 test_server.py

---

nc 127.0.0.1 12345

11.2 도커 파일 생성

별도의 디렉토리를 생성하고 dockfile과 위에서 생성한 python파일을 새 디렉토리에 배치한다.

mkdir my_first_project
mv test_server.py ./my_first_project/
cd my_first_project/
gedit dockerfile

dockerfile

FROM python:3.7

RUN mkdir /echo
COPY test_server.py /echo

CMD ["python", "/echo/test_server.py"]

빌드 후 테스트

ls 
dockerfile test_server.py

sudo docker build -t ehco_test .
sudo docker images
sudo docker run -t -p 12345:12345 --name et --rm echo_test
nc 127.0.0.1 12345

12 도커 이미지 푸시


12.1 도커 이미지 태그 변경 후 푸시

먼저 회원가입을 하도록 한다.

https://hub.docker.com/

회원가입한 정보를 토대로 다음 내용을 작성한다. login을 하지 않으면 정상 동작하지 않는다. gasbugs라는 문자열은 여러분이 사용하는 아이디로 바꿔서 실행해야만 한다.

sudo docker login
sudo docker tag echo_test ***gasbugs***/echo_test:v3.7
sudo docker images
sudo docker push ***gasbugs***/echo_test:v3.7

https://hub.docker.com/ 에 접속하여 내 레파지토리에 도커가 잘 등록됐는지 확인해본다.

모든 이미지 삭제 후 다시 gasbugs/echo_test 실행하여 잘 다운로드돼 실행되는지 테스트한다.

sudo docker rmi `docker images -q` -f
sudo docker run -t -p 12345:12345 --name et --rm gasbugs/echo_test:v3.7

12.2 도커 이미지 히스토리 확인

다음 명령을 사용하면 도커 이미지가 어떤 히스토리를 가졌는지 확인할 수 있다. 제일 상단에 앞서 우리가 dockerfile을 빌드해서 추가한 정보가 있다.

docker history ***gasbugs/echo_test***

13 프라이베이트 레지스트리 구현 및 사용


private registry 만들기

docker run -d --name docker-registry -p 5000:5000 registry

브라우저를 켜서 127.0.0.1:5000/v2/ 서비스 접속 가능한지 확인

프라이베이트 레지스트리에 이미지 푸시하기

sudo docker tag echo_test 127.0.0.1:5000/echo_test
sudo docker push 127.0.0.1:5000/echo_test

도커 API 관련 링크: https://docs.docker.com/registry/spec/api/

인증 관련 참고 링크: https://docs.docker.com/registry/configuration/#auth

14 워드프레스 도커 이미지 만들기 프로젝트


도커에서 제공하는 워드프레스와 MySQL은 따로 떨어진 형태로 존재한다. 여기서는 하나의 컨테이너에서 워드프레스와 MySQL을 동작시킬 수 있도록 만들어본다. 일단 가장 먼저 할 일은 PHP와 DB가 공존하는 환경을 찾는 것이다. 다양한 솔루션들이 있는데 그중에 XAMPP는 도커로 이미 만들어져있어 유용하게 사용할 수 있다. xampp는 apache, MariaDB, php가 설치돼 있다. 여기에 워드프레스만 올리면 바로 컨테이너를 만들 수 있다.

먼저 도커 허브에서 다음 사이트를 찾아내자.

https://hub.docker.com/r/tomsik68/xampp

이 사이트의 컨테이너를 불러온 뒤 워드프레스 설치 과정을 진행하도록 한다. 컨테이너에서 SSH와 다앙한 포트를 지원하지만 우리는 80포트만 사용할 예정이다.

sudo docker run --name WP -p 80:80 -d tomsik68/xampp

이제 가상환경은 준비됐으니 워드프레스를 설치하는 작업만 남았다. "워드프레스 다운로드"를 검색하자.

워드프레스 바로가기: https://ko.wordpress.org/download/

wget을 사용해 다운로드하고 압축을 푼다.

wget https://ko.wordpress.org/latest-ko_KR.tar.gz
tar -xf latest-ko_KR.tar.gz

컨테이너 내의 웹 파일 정리

sudo docker exec -it WP bash
chown daemon. /opt/lampp/htdocs 
cd /opt/lampp/htdocs/
mkdir backup
mv * ./backup/
exit

워드프레스 파일을 컨테이너에 복사하고 웹 루트 디렉토리에 배치

sudo docker cp wordpress WP:/opt/lampp/htdocs
sudo docker exec -it WP bash
mv /opt/lampp/htdocs/wordpress/* /opt/lampp/htdocs/
exit
sudo docker restart WP

127.0.0.1/phpmyadmin으로 접속해서 wordpress 데이터베이스 생성한다

마지막으로 127.0.0.1로 접속하여 워드프레스 설치를 웹 브라우저 화면으로 진행하면 된다

저장소에 보관 및 PULL

1. 컨테이너 STOP

docker stop WP

2. COMMIT

docker commit WP 본인ID/wordpress

PUSH할 이미지 확인

docker images

3. PUSH

도커 허브 로그인

docker login

PUSH

docker push 본인ID/wordpress

허브에 올라가있는지 확인
https://hub.docker.com/

4. PULL

기존 컨테이너 삭제

docker rm `docker ps -a -q`

허브에 올라간 이미지 실행

docker run -d -p 80:80 --rm 본인ID/wordpress
728x90

댓글

💲 추천 글