우분투에서 용량 늘리기

  • 50GB 추가

root@host:~# fdisk /dev/sdb
  • n 후 엔터 4번

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/ubuntu-vg/ubuntu-lv

# 늘어난 용량 확인


mysql 컨테이너 생성

컨테이너 접근 방법

# 1번 방법

컨테이너 IP를 알아야 함 (내부에서 내부라면 추천)

# 컨테이너 IP 조회
# 컨테이너 주소로 접속. 포트는 default기 때문에 명시 안해도 됨.

# 2번 방법

호스트의 포트로 접속

-p로 호스트포트를 정했다면 제일 편한방법 (돌아가는 방법)


# 2번 방법으로 진행

  • 일단 띄워보면 안되는 것을 확인
root@host:~# docker run -dp 33306:3306 --name dbtest mysql:5.7

 

https://hub.docker.com/_/mysql

 

mysql - Official Image | Docker Hub

Quick reference Supported tags and respective Dockerfile links 9.2.0, 9.2, 9, innovation, latest, 9.2.0-oraclelinux9, 9.2-oraclelinux9, 9-oraclelinux9, innovation-oraclelinux9, oraclelinux9, 9.2.0-oracle, 9.2-oracle, 9-oracle, innovation-oracle, oracle⁠8

hub.docker.com

# 컨테이너 사용법을 모른다면, 오피셜 이미지를 찾아서 사용법 찾아보면 된다.

# 적어도 MYSQL_ROOT_PASSWORD가 환경변수로 선언해야 컨테이너가 잘 동작한다.

# MYSQL_DATABASE=tomdb → create database tomdb;

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

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

  • MYSQL_ROOT_PASSWORD가 환경변수로 선언
root@host:~# docker run -dp 33306:3306 -e MYSQL_ROOT_PASSWORD=1234 --name dbdb mysql:5.7

  • 생성한 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

실습)

tomcat:latest 이미지와 mysql:8 이미지를 가지고 was-db를 구성해보세요. curl localhost:5959/dbtest.jsp로 접속했을때 db연동되는 화면이 보이도록 해보세요. mysql 컨테이너를 구성할때는 grant로 하지말고 환경변수로 하세요. jdbc도 호환되는걸 찾아서 한번 잘해보세요. webapps.dist는 무시하고, 우리가 원래하던대로 webapps/ROOT 에 파일을 두시면 됩니다.
  • host에 jsp 파일 생성
root@host:/docker/cmd# vi dbtest.jsp
<%@ 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 container의 ip>/tomcatdb";
                String Id="tomcatuser";
                String Pass="1234";

                Class.forName("com.mysql.jdbc.Driver");
                conn=DriverManager.getConnection(Url,Id,Pass);
                out.println("was-db Connection Success!");
        }catch(Exception e) {
                e.printStackTrace();
}
%>
root@host:/docker/cmd# wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar
  • was의 Dockerfile 수정
# 1. Ubuntu 최신 버전 기반
FROM ubuntu:latest

# 2. 작업 디렉토리 설정
WORKDIR /opt/tomcat

# 3. 필요한 패키지 설치
RUN apt update && apt install -y openjdk-11-jdk wget unzip curl

# 4. Tomcat 10 다운로드 및 압축 해제 (임시 디렉토리 사용)
RUN wget 
https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.39/bin/apache-tomcat-10.1.39.zip
 -P /tmp \
    && unzip /tmp/apache-tomcat-10.1.39.zip -d /tmp \
    && mv /tmp/apache-tomcat-10.1.39 /opt/tomcat/apache-tomcat \
    && rm /tmp/apache-tomcat-10.1.39.zip

# 5. MySQL JDBC 드라이버 다운로드
RUN wget 
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar
 -P /opt/tomcat/apache-tomcat/lib/

# 6. JSP 파일 복사 (경로 수정)
COPY dbtest.jsp /opt/tomcat/apache-tomcat/webapps/ROOT/dbtest.jsp

# 7. 실행 권한 부여
RUN chmod +x /opt/tomcat/apache-tomcat/bin/catalina.sh

# 8. Tomcat 실행
CMD ["/opt/tomcat/apache-tomcat/bin/catalina.sh", "run"]
  • Docker 이미지 빌드
docker build -t tomcat:latest .
  • MySQL 컨테이너 실행
root@host:/docker/cmd# docker run -dp 8989:3306 \
  -e MYSQL_ROOT_PASSWORD=1234 \
  -e MYSQL_DATABASE=tomcatdb \
  -e MYSQL_USER=tomcatuser \
  -e MYSQL_PASSWORD=1234 \
  --name dbdb \
  mysql:8
  • Tomcat 컨테이너 실행
docker run -d --name tomcatserver -p 5959:8080 tomcat:latest
  • 결과 확인
root@host:/docker/cmd# curl localhost:5959/dbtest.jsp

풀이)

  1. Dockerfile을 어떻게 작성해야할지 알고 있다면, 바로 작성. 모른다면 컨테이너를 띄워보면된다.
  2. tomcat을 db에 연동해야하니까 mysql:8을 먼저띄우고 그 다음에 tomcat:latest를 띄워보자
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 inspect tomdb | grep -i ipa

# publish된 포트를 써도되지만 내부로 접근하는게 깔끔하므로 ip 조회

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

# tomuser가 tomdb라는 db 접근가능한걸 확인

2-2. tomcat을 띄울 때 필요한 파일

  • dbtest.jsp
  • jdbc
  • dbtest.jsp 구성
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
  • jdbc를 호스트에 다운로드
wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.23/mysql-connector-java-8.0.23.jar
root@host:/docker/tomcat# docker run -dp 8989:8080 --name tomcat tomcat:latest

root@host:/docker/tomcat# docker exec -it tomcat bash

# tomcat 컨테이너의 경우, webapps에 ROOT라는 디렉토리가 없다. 만들어줘야 함!

  • webapps에 ROOT라는 디렉토리 생성
root@5c172f838134:/usr/local/tomcat# mkdir -p webapps/ROOT

 

  • 창을 하나 더 열어서 준비해놓은 파일을 복사
root@host:~# cd /docker/tomcat
root@host:/docker/tomcat# vi dbtest.jsp

# 172.17.0.4:3306/tomdb

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로 작성하면,

 Tomcat Dockerfile -------------------

  • tomcat을 삭제후 tomcat Dockerfile 작성
root@host:/docker/tomcat# docker rm -f tomcat
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 옵션으로 명시하면 된다.

  • 기존 db컨테이너 삭제
root@host:/docker/tomcat# docker rm -f tomdb
  • 만든 이미지로 컨테이너 생성
root@host:/docker/tomcat# docker run -dp 3307:3306 --name tomdb mydb:1


--link 옵션

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

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

# 작은 DNS, /etc/hosts 쓰듯이 사용

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가 맵핑되어 있음

  • ping명령이 없으니까 설치해서 실제로 이름으로 컨테이너를 찾아갈 수 있는지 확인하기
root@81ab49ff835d:/usr/local/tomcat# apt update -y && apt install -y iputils-ping

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


자율과제)

위에서 했던 was-db연동을 컨테이너 이름으로 해보자

실습)

wordpress와 db라는 각 디렉토리에 Dockerfile을 만드세요. 이미지빌드는 /docker/wp 에서 하시고, 각 Dockerfile들은 wordpress:latest 및 mysql:8을 베이스이미지로 wp:1, db:1 라는 이미지를 빌드하여야합니다. 워드프레스에서 데이터베이스를 찾아갈땐 컨테이너의 IP가 아닌, 컨테이너의 이름으로 찾아가시고 컨테이너를 띄웠을때 wordpress블로그가 뜨도록 만들어보세요. 접속주소는 211.183.3.100:8585 입니다.
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
.
├── db
└── wordpress


root@host:/docker/wp/db# mysql -u root -p1234
root@host:/docker/wp/db# docker run -dp 3308:3306 \
  -e MYSQL_ROOT_PASSWORD=1234 \
  -e MYSQL_DATABASE=wp_DB\
  -e MYSQL_USER=wpuser \
  -e MYSQL_PASSWORD=1234 \
  --name db\
  mysql:8
root@host:/docker/wp/db# mysql -u wpuser -p1234 -h 172.17.0.2

wpuser로 db 접속이 안되는 문제 발생 ♨

mysql-client를 깔았는데, mariadb-server를 설치해서 충돌 생김

uninstall mariadb-server 했더니 mysql-client 일부가 삭제됐는지, 작동 안함

mysql-client를 다시 설치했더니, 뭔가 새롭게 깔리고 문제 해결


풀이)

root@host:/docker/wp# cd db/
root@host:/docker/wp/db# vi Dockerfile
FROM mysql:8
ENV MYSQL_ROOT_PASSWORD=1234
ENV MYSQL_PASSWORD=1234
ENV MYSQL_DATABASE=wpdb
ENV MYSQL_USER=wpuser
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를 하겠다.

 

  • wordpress 구성
root@host:/docker/wp# vi wordpress/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


사설저장소(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 이라는 이름을 갖는 이미지 태그를 사설저장소에 맞게 변경

  • 211.183.3.100:5000/wp:1 이라는 새로운 태그 생성
root@host:/docker/wp# docker tag wp:1 211.183.3.100:5000/wp:1
root@host:/docker/wp# docker push 211.183.3.100:5000/wp:1

  • 도커의 설정을 변경하기 위한 설정파일 생성
root@host:/docker/wp# vi /etc/docker/daemon.json
{
        "insecure-registries": ["211.183.3.100:5000"]
}

# 사설저장소의 주소를 적어주면 된다.

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

  • 설정 변경했으니까 재시작
root@host:/docker/wp# systemctl restart docker

  • 다시 push
root@host:/docker/wp# docker push 211.183.3.100:5000/wp:1
  • 확인
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

# http://211.183.3.100:5001


실습)

우분투 서버를 하나 클론해서 도커 설치후 nginx:latest를 베이스이미지로 mynginx:1 이라는 <레포>:<태그>를 갖는 이미지를 만든 후, 위 사설저장소에 push해보세요.
docker build -t mynginx:1 .
docker run -dp 8686:80 --name mynginx mynginx:1
docker run --name reg -dp 5000:5000 --restart=always -v /registry:/var/lib/registry/docker/registry/v2 registry:latest
docker tag mynginx:1 211.183.3.100:5000/mynginx:1
vi /etc/docker/daemon.json
{
        "insecure-registries": ["211.183.3.100:5000"]
}
systemctl restart docker
docker push 211.183.3.100:5000/mynginx:1
curl http://211.183.3.100:5000/v2/_catalog
docker run -d -p 5002: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