본문 바로가기
AWS Cloud School 8기/도커(docker)

디스크 용량 확장/ mysql 컨테이너 생성/--link 옵션/ 사설저장소(private registry)

by YUNZEE 2025. 4. 2.
728x90

우분투에서 디스크 용량 확장

더보기
root@host:~# pvcreate /dev/sdb1
root@host:~# vgextend ubuntu-vg /dev/sdb1
root@host:~# lvextend -l +100%FREE -n /dev/mapper/ubuntu--vg-ubuntu--lv
root@host:~# resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

 

- 늘어난 용량을 확인할 수 있음

- 진짜 용량이 100% 차서 디스크 추가도 안된다면 밑에 명령어 추가해 주자

docker system prune -af

mysql 컨테이너 생성

더보기

- 초기의 루트 패스워드를 설정할 수 없음

- 그래서 환경 변수로 선언할 수 있게 만들어둠

 

root@host:~# docker run -dp 33306:3306 --name dbtest mysql:5.7

- 적어도 MYSQL_ROOT_PASSWORD가 환경변수로 선언되어 있어야 컨테이너가 잘 동작됨

- 일단 띄워보자

 - 적어도 MYSQL_ROOT_PASSWORD가 환경변수로 선언되어 있어야 컨테이너가 잘 동작함

# MYSQL_DATABASE=tomdb => create database tomdb;

# MYSQL_USER=tomuser => tomuser라는 사용자를 생성

# MYSQL_PASSWORD=1234 => tomuser라는 사용자의 암호를 1234로 설정

 

- 생성한 mysql:5.7 컨테이너에 접속하기 위해 호스트에 mysql 클라이언트 설치.

root@host:~# apt update -y

root@host:~# apt install -y mysql-client-core-8.0

 

root@host:~# mysql -u root -p1234 -h 211.183.3.100 -P 33306

 - 2번 방법(호스트의 포트)으로 접속. -P로 호스트포트로 정했다면 제일 편한 방법임

- 컨테이너 아이피 조회 후

 - 컨테이너 주소로 접속, 포트는 default이기 때문에 명시 안 해도 됨

실습) tomcat:latest 이미지와 mysql:8 이미지를 가지고 was-db를 구성해 보세요. curl localhost:5959/dbtest.jsp로 접속했을 때 db연동되는 화면이 보이도록 해보세요. mysql 컨테이너를 구성할 때는 grant로 하지 말고 환경변수로 하세요. jdbc도 호환되는 걸 찾아서 한번 잘해보세요.

더보기

1. Dockerfile을 어떻게 작성해야 할지 알고 있다면, 바로 작성하고, 모른다면 컨테이너를 띄워보면 됨

2. tomcat을 db에 연동해야 하니까 mysql:8을 먼저 띄우고 그다음에 tomcat:latest 한다.

 

-> 여기서 질문! grant로 하지 말고 환경 변수로 하라는 말의 의미는 뭘까요? 

EX) GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'%'

-> 특정 사용자에게 데이터베이스에 대한 권한을 부여할 수 있음. 사용자가 데이터베이스를 수정하거나 조회할 수 있는 권한을 설정

-> 근데 여기서 GRANT를 하지 말고 환경변수 설정을 해주라고 했으니까

  • MYSQL_ROOT_PASSWORD: root 사용자 비밀번호 설정.
  • MYSQL_DATABASE: 자동으로 생성할 데이터베이스 이름.
  • MYSQL_USER: 새로 생성할 사용자 이름.
  • MYSQL_PASSWORD: 새로 생성할 사용자 비밀번호.

위의 것들 사용해서 MYSQL을 설정해 주면 됨./

 

root@host:/docker# mkdir tomcat
root@host:/docker# cd tomcat

root@host:/docker/tomcat# docker run -dp 3308:3306 --name tomdbdb -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_USER=tomuser -e MYSQL_PASSWORD=1234 -e MYSQL_DATABASE=tomdbdb mysql:8

-> 뭔가 수정하고 다시 만들어주고 싶다면, 위의 것들을 수정해 주면 됨

- 내부 아이피

root@host:/docker/tomcat# mysql -u tomuser -p1234 -h 172.17.0.3

 - tomuser가 tomdbdb라는 db로 접근 가능한 걸 확인 가능

 

- 이번에는 tomcat을 띄울 건데, 필요한 파일을 생각해 보면 jdbc랑 dbtest.jsp가 생각

 

wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar

# jdbc를 호스트에 다운로드

tee dbtest.jsp<<EOF
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*"%>
<h1>DB</h2>
<%
        Connection conn=null;
        try{
                String Url="jdbc:mysql://<DB주소>/<DB이름>";
                String Id="<DB유저>";
                String Pass="<유저암호>";

                Class.forName("com.mysql.jdbc.Driver");
                conn=DriverManager.getConnection(Url,Id,Pass);
                out.println("was-db Connection Success!");
        }catch(Exception e) {
                e.printStackTrace(); 
}
%>
EOF
#dbtest.jsp

docker exec -it tomcat bash

docker exec: 실행 중인 컨테이너에서 명령어를 실행하는 명령어 ex) 명령어를 실행하거나, 파일을 확인함

-it는 두 가지 옵션을 합친 것

-i는 interactive로 컨테이너의 표준 입력을 활성화함. 즉, 사용자 입력을 받을 수 있게 됨

-t는 터미널을 생성함. 이 옵션은 사용자가 터미널을 통해 명령어를 입력하고 결과를 볼 수 있도록 해줌

tomcat은 실행 중인 컨테이너의 이름임(docker ps) 명령어로 확인할 수 있음

bash는 linux시스템에서 사용하는 명령어 셸임. bash는 명령어를 입력하고 실행하는 터미널 프로그램임

-> 이 명령어를 사용하면 컨테이너 안에 터미널 창이 열리게 되며, 명령어를 실행할 수 있음

 

위에 명령어를 입력해 주면 usr/local/tomcat으로 WORKDIR이 생기는데 이때  webapp에 ROOT라는 디렉터리가 없어서 만들어줘야 됨.

 

root@ef51f972297d:/usr/local/tomcat# mkdir -p webapps/ROOT

-> 근데 이걸 왜 만들어 줘야 되는 걸까?

-> Tomcat 서버에서 기본 웹 애플리케이션을 배치하는 장소로, 이곳에 웹 애플리케이션 파일을 배치하면 해당 애플리케이션이  Tomcat 서버의 기본 애플리케이션으로 실행

root@ef51f972297d:/usr/local/tomcat# ls webapps
ROOT

 - inspect로 확인할 DB주소

 

root@host:/docker/tomcat# docker cp dbtest.jsp

tomcat:/usr/local/tomcat/webapps/ROOT

root@host:/docker/tomcat# docker cp mysql-connector-java-8.0.23.jar

tomcat:/usr/local/tomcat/lib

# 컨테이너 내부에 jdbc가 잘 복사됐는지 확인

 

# 호스트에서 컨테이너를 재시작.

 

# db와 연동이 잘 된 걸 확인가능하다.

 

=> 이 과정을 Dockerfile로 작성해 보자.

 

root@host:/docker/tomcat# docker rm -f tomcat

# tomcat을 삭제 후 tomcat Dockerfile 작성

 

root@host:/docker/tomcat# vi Dockerfile

FROM tomcat:latest

WORKDIR /usr/local/tomcat

RUN mkdir /usr/local/tomcat/webapps/ROOT

COPY dbtest.jsp ./webapps/ROOT/dbtest.jsp

COPY mysql* /usr/local/tomcat/lib

# CMD는 이미 베이스이미지에 구성되어 있으므로 안함.

 

root@host:/docker/tomcat# docker build -t mytom:1 .

# 이미지 빌드

 

root@host:/docker/tomcat# docker run -dp 8989:8080 --name tom mytom:1

 

# 이미지가 잘 만들어진 걸 테스트.

 

mysql의 Dockerfile

 

vi db-Dockerfile

 

FROM mysql:8

ENV MYSQL_ROOT_PASSWORD=1234

ENV MYSQL_PASSWORD=1234

ENV MYSQL_USER=tomuser

ENV MYSQL_DATABASE=tomdb 

# 도커파일의 이름이 다르면 -f 옵션으로 명시하면 됨

 

root@host:/docker/tomcat# docker rm -f tomdb

# 기존 db컨테이너 삭제

 

root@host:/docker/tomcat# docker run -dp 3307:3306 --name tomdb mydb:1

# 만든 이미지로 컨테이너 생성

 

--link 옵션

: tomcat -mysql을 연동할 때 항상 mysql의 컨테이너 IP를 조회해서 찾아가는 건 너무 번거로움

-p를 통해 퍼블리시된 외부(호스트) 주소로 찾아가는 것도 별로임

더보기

- 다시 다 삭제하고 시작

root@host:/docker/tomcat# docker rm -f $(docker ps -qa)
c69cedd2fcc8
00faebb6b65d
96d626d189ec
3d3230b93322

 

root@host:/docker/tomcat# docker run -dp 3307:3306 --name tomdb -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_USER=tomuser -e MYSQL_PASSWORD=1234 -e MYSQL_DATABASE=tomdb mysql:8

 

root@host:/docker/tomcat# docker run -it --name tom --link tomdb tomcat:latest bash

# /etc/hosts 파일에 tomdb에 대한 IP가 맵핑이 되어있음

 

root@81ab49ff835d:/usr/local/tomcat# apt update -y && apt install -y iputils-ping

# ping명령이 없으니까 설치해서 실제로 이름으로 컨테이너를 찾아갈 수 있는지 확인해 보자.

- 컨테이너 이름으로 찾아감

- 컨테이너의 주소 대신 이름을 넣어도 찾아감

- 컨테이너는 생성 및 삭제될 때마다 IP가 변경되지만, 우리는 항상 일정한 이름을 갖는 컨테이너를 생성할 수는 있음. 따라서 언제든지 해당컨테이너의 이름으로 특정 가능함.

 

root@host:/docker/tomcat# apt install -y tree

# 디렉터리의 구조를 보여줌

 

root@host:/docker# mkdir /docker/wp

root@host:/docker/wp# cd /docker/wp

 

root@host:/docker/wp# mkdir wordpress db
root@host:/docker/wp# tree

실습) wordpress와 db라는 각 디렉터리에 Dockerfile을 만드세요. 이미지빌드는 /docker/wp 에서 하시고, 각 Dockerfile들은 wordpress:latest 및 mysql:8을 베이스이미지로 wp:1 , db:1라는 이미지를 빌드하여야 합니다. 워드프레스에서 데이터베이스를 찾아갈 땐 컨테이너의 IP가 아닌, 컨테이너의 이름으로 찾아가시고 컨테이너를 띄웠을 때 wordpress블로그가 뜨도록 만들어보세요.

접속주소는 211.183.3.100:8585입니다.

더보기

db 구성

root@host:/docker/wp# vi Dockerfile

root@host:/docker/wp/db# cd..

root@host:/docker/wp# docker build -t db:1./db

 

root@host:/docker/wp# docker run -dp 3307:3306 --name dbdbdb db:1

 

# wordpress를 구성할 때 어차피 --link 쓸거긴 하지만, 혹시 트러블슈팅을 해야 할 수도 있기 때문에 -p로 publish를 사용하겠음

wp 구성

root@host:/docker/db# vi Dockerfile

FROM wordpress:latest
ENV WORDPRESS_DB_HOST=dbdbdb
ENV WORDPRESS_DB_PASSWORD=1234
ENV WORDPRESS_DB_USER=wpuser
ENV WORDPRESS_DB_NAME=wpdb
# docker run을 할때 --link=dbdbdb (WORDPRESS_DB_HOST로 하면 될것 같다)

root@host:/docker/wp# docker build -t wp:1 ./wordpress

 

root@host:/docker/wp# docker run -dp 8585:80 --name mywp --link dbdbdb wp:1

 

경고 의미

 - SecretsUsedInArgOrEnv 경고는 민감한 데이터(예: 비밀번호)를 ARG나 ENV 명령어로 설정하는 것은 보안상 좋지 않다는 의미임.

- 즉, MySQL의 비밀번호와 같은 중요한 정보를 ENV나 ARG로 Dockerfile에서 설정하는 것은 보안 취약점을 만들 수 있기 때문에 경고가 발생한 것

사설저장소(private registry) 컨테이너 생성

더보기

 root@host:/docker/wp# docker run --name reg -dp 5000:5000 --restart=always -v /registry:/var/lib/registry/docker/registry/v2 registry:latest

- 레지스트리 컨테이너 생성

 

- 위에서 만든 wp:1을 내 사설저장소에 push 해보자.

- wp:1 이라는 이름을 갖는 이미지 태그를 사설저장소에 맞게 변경

 

root@host:/docker/wp# docker tag wp:1 211.183.3.100:5000/wp:1

- 211.183.3.100:5000/wp:1 이라는 새로운 태그 생성.

root@host:/docker/wp# vi /etc/docker/daemon.json

- 도커의 설정을 변경하기 위한 설정파일 생성

- 사설저장소의 주소를 적어주면 됨

- 위 사설저장소가 안전하지 않아도(http통신) 사용하겠음

 

root@host:/docker/wp# systemctl restart docker

# 설정 변경했으니까 재시작 

root@host:/docker/wp# docker push 211.183.3.100:5000/wp:1

# 다시 push

root@host:/docker/wp# curl http://211.183.3.100:5000/v2/_catalog

root@host:/docker/wp# docker run -d -p 5001:8080 --name registry_web --restart=always --link reg -e REGISTRY_URL=http://211.183.3.100:5000/v2 -e REGISTRY_NAME=211.183.3.100:5000 hyper/docker-registry-web

- 사설 저장소를 gui로 볼 수 있는 간단한 java앱 컨테이너 생성

 

728x90