우분투에서 용량 늘리기
- 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를 알아야 함 (내부에서 내부라면 추천)
# 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, oracle8
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
풀이)
- Dockerfile을 어떻게 작성해야할지 알고 있다면, 바로 작성. 모른다면 컨테이너를 띄워보면된다.
- 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
root@host:/docker/tomcat# mysql -u tomuser -p1234 -h 172.17.0.4
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
- webapps에 ROOT라는 디렉토리 생성
root@5c172f838134:/usr/local/tomcat# mkdir -p webapps/ROOT
- 창을 하나 더 열어서 준비해놓은 파일을 복사
root@host:~# cd /docker/tomcat
root@host:/docker/tomcat# vi dbtest.jsp
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를 통해 퍼블리시된 외부(호스트)주소로 찾아가는것도 별로
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
실습)
우분투 서버를 하나 클론해서 도커 설치후 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
'AWS Cloud School 8기 > Docker' 카테고리의 다른 글
58일차) 2025-03-24(docker-compose) (0) | 2025.03.24 |
---|---|
57일차) 2025-03-21(앱배포-python, nginx) (0) | 2025.03.21 |
56일차) 2025-03-20(앱 배포-java/js, 컨테이너화, dockerignore) (0) | 2025.03.20 |
54일차) 2025-03-18(도커 이미지, Dockerfile, DockerRegistry) (0) | 2025.03.18 |
53일차) 2025-03-17(컨테이너 가상화) (0) | 2025.03.17 |