본문 바로가기
  • 지요미의 IT성장일기
Docker

Docker 3

by 지요미=P 2024. 1. 30.
728x90

 

컨테이너 지우기

docker rm -f $(docker ps -a -q)

 

 

wp-db 생성하기

my.cnf라는 환경구성 설정하기

# mkdir wordpress && cd $_

# vi my.cnf
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
skip-external-locking
bind-address = 0.0.0.0

여기서 관건은 bind-address = 0.0.0.0

 

 

wordpress를 실행할 수 있는 MySQL 데이터베이스 서버 구성하기

# vi Dockerfile.wp-db
FROM ubuntu:20.04
ENV DEBIAN_FRONTEND noninteractive

# apt install 시에, 발생할 수 있는 예를들어 '패키시 설치 정말 하겠습니까?', '비밀번호 입력해주세요'같은거를 무시하고 진행할 수 있다고 한다.
ENV MYSQL_ROOT_PASSWORD=Test1752!
ENV MYSQL_DATABASE=wordpress
ENV MYSQL_USER=wpuser
ENV MYSQL_PASSWORD=Test1752!
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt-get update && \
    apt-get install -y mariadb-server
RUN service mysql start && \
    mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "CREATE DATABASE ${MYSQL_DATABASE};" && \
    mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "CREATE USER '${MYSQL_USER}'@'%' IDENTIFIED BY '${MYSQL_PASSWORD}';" && \
    mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "GRANT ALL PRIVILEGES ON ${MYSQL_DATABASE}.* TO '${MYSQL_USER}'@'%';" && \
    mysql -u root -p${MYSQL_ROOT_PASSWORD} -e "FLUSH PRIVILEGES;" && \
    service mysql stop
COPY my.cnf /etc/mysql/my.cnf
EXPOSE 3306
CMD ["mysqld_safe"]

 

데이터베이스, 유저, 프리빌리지 권한 모두 생성하고 mysql 실행 후 멈춰!

  1. FROM ubuntu:20.04
    이미지는 Ubuntu 20.04를 기반

  2. ENV DEBIAN_FRONTEND noninteractive
    패키지 설치 중에 발생하는 대화형 메시지를 피하기 위한 것으로, 비대화형 모드로 설정

  3. MySQL 관련 환경 변수 설정:
    • ENV MYSQL_ROOT_PASSWORD=Test1752!: #MySQL의 root 사용자 비밀번호를 지정
    • ENV MYSQL_DATABASE=wordpress #WordPress를 위한 데이터베이스의 이름을 지정
    • ENV MYSQL_USER=wpuser #WordPress용 데이터베이스 사용자의 이름을 지정
    • ENV MYSQL_PASSWORD=Test1752! WordPress용 데이터베이스 사용자의 비밀번호를 지정
  4. RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list 
    Ubuntu 패키지 관리자의 소스 리스트를 Daum Kakao의 미러 서버로 변경

  5. RUN apt-get update && apt-get install -y mariadb-server
    패키지 업데이트 후 MariaDB 서버를 설치

  6. RUN service mysql start && ... && service mysql stop
    MySQL 서버를 시작하고, 데이터베이스 및 사용자를 생성한 뒤, 권한을 부여하고, 설정을 적용한 후 MySQL 서버 중지

  7. COPY my.cnf /etc/mysql/my.cnf
    host 시스템의 my.cnf 파일을 컨테이너 내부의 /etc/mysql/my.cnf 경로에 복사하고 이를 통해 사용자 정의 MySQL 설정 적용

  8. EXPOSE 3306
    호스트와 연결할 수 있도록 MySQL 서버가 사용하는 포트 3306 노출

  9. CMD ["mysqld_safe"]
    컨테이너가 시작될 때 실행되는 명령을 지정한다. 여기서는 mysqld_safe를 실행하여 MySQL 서버 스타트 가즈아

 

docker build -t wp-db:v1.0 -f Dockerfile.wp-db .
docker run -d -p 3306:3306 --name wp-db --network test_bridge wp-db:v1.0

-f : 파일명

 

 

wp-web 생성하기

CentOS 7에서 WordPress를 실행하는 웹 서버용 Docker 이미지 만들기!

# vi Dockerfile.wp-web

FROM centos:7
MAINTAINER itssp0405@gmail.com
RUN yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm && \
    yum -y install epel-release yum-utils && \
    yum-config-manager --enable remi-php74 && \
    yum -y install httpd php php-mysqlnd wget unzip mysql
RUN wget https://ko.wordpress.org/latest-ko_KR.zip
WORKDIR /var/www/html
RUN unzip /latest-ko_KR.zip
RUN mv wordpress/* .
RUN chown -R apache:apache /var/www
EXPOSE 80
ENTRYPOINT ["httpd", "-D", "FOREGROUND"]
  1. FROM centos:7
    기본 이미지를 CentOS 7로 지정

  2. MAINTAINER itsp0405@gmail.com
    Dockerfile을 유지 관리하는 사람의 연락처 정보를 제공(이 지침은 최신 Docker에서 더 이상 사용되지 않는 것으로 간주됨)

  3. Remi 리포지토리를 설치 및 구성하고 패키지 관리자를 사용하여 Apache(httpd), PHP 및 PHP 확장 설치
    • yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm && \
      Remi 리포지토리 설치
    • yum -y install epel-release yum-utils && \
      EPEL 리포지토리 및 yum 유틸리티를 설치
    •  yum-config-manager --enable remi-php74 && \
      PHP 7.4용 Remi 리포지토리를 활성화
    • yum -y install httpd php php-mysqlnd wget unzip mysql
      Apache(httpd), PHP, PHP MySQL 확장, wget, unzip, mysql 설치
  4. RUN wget https://ko.wordpress.org/latest-ko_KR.zip
    워드프레스 한국어 최신 버전 다운로드

  5. WORKDIR /var/www/html
    WordPress 파일을 추출할 작업 디렉토리 설정 /var/www/html

  6. RUN unzip /latest-ko_KR.zip
    다운로드한 워드프레스 아카이브의 압축풀기

  7. RUN mv wordpress/* .
    압축을 푼 WordPress 디렉토리의 내용을 현재 디렉토리로 이동 ../var/www/html

  8. RUN chown -R apache:apache /var/www
    디렉터리 및 해당 내용의 소유권을 Apache 사용자 및 그룹으로 변경 /var/www

  9. ENTRYPOINT ["httpd", "-D", "FOREGROUND"]
    컨테이너가 시작될 때 실행할 명령을 지정하는데 이 경우 포그라운드에서 Apache 웹 서버를 시작!
    여기서 포인트 포그라운드!!! 
    바깥에서 backgroud 실행할거라서 충돌을 대비하기 위해서 포그라운드로 반드시 넣어줄 것!

 

docker build -t wp-web:v1.0 -f Dockerfile.wp-web .
docker run -d -p 80:80 --name wp-web --network test_bridge wp-web:v1.0

 

172.25.0.136:80

 

 

도커 데이터 관리

- Bind Mount

mkdir volume && cd $_
mkdir bm01 ; touch bm01/test.txt
docker container run -itd --name bm-test -v /root/volume/bm01:/mnt centos:7
docker container exec bm-test ls /mnt

 

 

- Volume

docker volume create my-vol01
docker volume list
docker volume inspect my-vol01
 "Mountpoint": "/var/lib/docker/volumes/my-vol01/_data"
docker container run -itd --name vol-test -v my-vol01:/mnt centos:7
docker container run -itd -p 801:80 --name vol-web -v my-vol01:/usr/local/apache2/htdocs:ro httpd:latest   #ro:readonly
curl 172.25.0.136:801
 <html><body><h1>It works!</h1></body></html>
docker container exec vol-test sh -c "echo "Nihao-jyoonchu" > /mnt/index.html"
curl 172.25.0.136:801
 Nihao-jyoonchu

 

 

 

도커 네트워크 관리

docker network list
docker network inspect bridge
  "com.docker.network.bridge.name": "docker0",
docker network create new-net --subnet 10.33.0.0/16 --ip-range 10.33.0.0/20 --gateway 10.33.0.1
docker network list

 

docker network inspect bridge

 

docker tag sesac:sale jyoonpark/sesac:sale
docker images

그냥 이미지는 주소가 없으니까 docker hub는 주소같은 작업을 한다.

 

doker imgaes
docker login
docker push jyoonpark/sesac:sale

 

도커 허브에 레포지토리가 생성되었다!! 우왕

레포지토리 안에 sale이라는 이미지도 업로드가 되었음!!!

짱신기해 ㅎㅎ

 

 

food 이미지도 업로드 해보깅

docker tag sesac:food jyoonpark/sesac:food
docker images
docker push jyoonpark/sesac:food

 

 

Centos에서 이미지를 도커허브로 이미지를 push 했으니

Ubuntu를 통해 도커허브로 이미지를 pull 해보는 테스트

sudo docker run -d -p 8081:80 --name sale jyoonpark/sesac:sale
sudo docker run -d -p 8082:80 --name food jyoonpark/sesac:food
sudo docker ps

run을 사용하는 이유는 컨테이너를 pull + 실행 시키기 위해서 ~!

 

접속테스트

 


도커허브 더보기!!

도커 허브에 다른 사용자를 등록시켜주면

 

그 사용자가 명령어를 통해 이렇게 다운로드를 받을 수도 있다!!

 

Mr.Ddonggae씨 아이디어 공유 고맙습니다...ㅎ


 

 

운영자 역할 (CentOS)

# mkdir onbuild && cd $_

# vi Dockerfile.base
FROM ubuntu:18.04
RUN sed -i 's/archive.ubuntu.com/ftp.daumkakao.com/g' /etc/apt/sources.list
RUN apt-get -y update
RUN apt-get -y install nginx
EXPOSE 80
ONBUILD ADD website*.tar /var/www/html/
CMD ["nginx", "-g", "daemon off;"]

website*.tar /var/www/html/ 요기는 제외하고 이미지가 만들어진다.

 

# docker build -t jyoonpark/web-base:v1.0 -f Dockerfile.base .
# docker login
# docker push jyoonpark/web-base:v1.0

#vi Dockerfile
FROM jyoonpark/web-base:v1.0

 

개발자 역할 (Ubuntu)

aws.tar
1.52MB

 

172.25.0.139는 Ubuntu IP임

짠!!

# mkdir onbuild && cd $_
# ls
  website.tar
  Dockerfile

# sudo docker images
# sudo docker build -t jyoonpark/web-site:v1.0 .
# sudo docker push jyoonpark/web-site:v1.0

 

운영자 역할 (CentOS)

docker run -d -p 8088:80 --name=web-site jyoonchu/web-site:v1.0

 

 

 

 

도커허브 꾸며보기

 

 

GCP

새 프로젝트 생성

 

인스턴스 만들기

#!/bin/bash
curl -fsSL https://get.docker.com/ | sh
yum -y install bash-completion wget unzip mysql
curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker.sh
systemctl enable --now docker

 

 

Compute Engine > 메타데이터 만들기 > SSH 키

 

도커 사설 레지스트리

 

sudo usermod -a -G docker jyoon
docker run -d -p 5000:5000 --restart=always --name private-docker-registry registr  #저장소 서버

 

 

 

 

방화벽 규칙 만들기

 

 

인스턴스 > 수정 > 방화벽 태그하기

직접 타이핑쳐서 넣으면 된다.

 

 

 

도커 사설 레지스트리

34.64.225.72

Docker 운영팀에서 하는거임~!

# vi /etc/docker/daemon.json # 클라이언트
  { "insecure-registries":["34.64.225.72:5000"] }

# systemctl restart docker

 

도커 이미지 중에서 sesac들만 올려보자!!

docker images
docker tag sesac:sale 34.64.225.72:5000/sesac:sale
docker push 34.64.225.72:5000/sesac:sale

 

34.64.225.72:5000 => 일조의 name space이자 주소임!

docker tag sesac:food 34.64.225.72:5000/sesac:food
docker push 34.64.225.72:5000/sesac:food

 

docker tag wp-db:v1.0 34.64.225.72:5000/wp-db:v1.0
docker push 34.64.225.72:5000/wp-db:v1.0

docker tag wp-web:v1.0 34.64.225.72:5000/wp-web:v1.0
docker push 34.64.225.72:5000/wp-web:v1.0

 

 

=> total 4개를 업로드함

 

 

업로드 된 이미지/태그 조회하기

이미지 조회
curl -X GET 34.64.225.72:5000/v2/_catalog

이미지 태그 조회
curl -X GET 34.64.225.72:5000/v2/sesac/tags/list

이렇게 리스트를 확인할 수가 있다.

 

docker rmi -f $(docker images -q)

docker images
docker pull 10.34.64.225.72:5000/wp-db:v1.0

심지어 ip도 잘못입력함;;;ㅋㅋㅋㅋ

# sudo vi /etc/docker/daemon.json
  { "insecure-registries":["34.64.225.72:5000"] }
# sudo systemctl restart docker

GCP 인스턴스 외부ip인 34.64.225.72:5000가 충돌없이 통신할 수 있도록 데몬파일을 구성해준다.

이에 대한 자세한 설명은 아래 docker docs를 통해 찾아보았음!

미래에 또 궁금할 날 위해 메모....

https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file

 

docker pull 34.64.225.72:5000/wp-db:v1.0
docker run -d -p 3306:3306 --name wp-db 34.64.225.72:5000/wp-db:v1.0
docker ps

 

 

 

ip와 상관없이 네트워크를 빠르게 설정하는 방법

네트워크를 먼저 만들고 그 후에 연결하면 된다.

docker network create new-net
docker inspect new-net

docker network create new-net2
docker inspect new-net2

docker network connect new-net wp-db
docker network connect new-net wp-web

 

 

728x90

'Docker' 카테고리의 다른 글

멀티 컨테이너 구현2  (1) 2024.01.31
멀티 컨테이너 구현1  (1) 2024.01.31
Docker 2  (3) 2024.01.29
Docker 명령어 + 우분투에 도커 설치하기  (3) 2024.01.26
Docker 1  (1) 2024.01.25