
Ohchestration :여러개의 Container를 정의하고 배포한다.
curl -L "https://github.com/docker/compose/releases/download/1.27.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 권한 확인
ls -l /usr/local/bin/docker-compose
# 실행 권한을 준다.
chmod a+x /usr/local/bin/docker-compose
# 버전 확인
docker-ompose --verion

mkdir compose01
# Dockerfile 생성
vi build_image
# 작성한 내용
FROM rockylinux:9.3.20231119
RUN dnf update -y && dnf install -y httpd
# 실행
docker image build -t httpd:1.0 -f build_image .

docker image history httpd:1.0

vi Dockerfile
# 작성한 내용
FROM httpd:1.0
VOLUME ["/var/www/html/files"]
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
vi docker-compose.yaml
# 작성한 내용
version: '2.0'
services:
webserver_80:
build: .
ports:
- "80:80"
volumes:
- "/root/htmldata:/var/www/html"
webserver_8080:
build: .
ports:
- "8080:80"
volumes:
- "/root/htmldata:/var/www/html"
networks:
compose_network:
driver: bridge
mkdir ~/htmldata
echo "docker-compose" > ~/htmldata/index.html
# 컴포즈 실행 (compose 파일이 있는 곳)
docker compose up
# 컴포트 프로세스
docker-compose ps

10.17.0.150:80
10.17.0.150:8080

docker-compose down --rmi all
docker-compose up -d

version: '2.0'
services:
mariadb:
image: mariadb:latest
container_name: mariadb-server
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: P@ssw0rd
MYSQL_DATABASE: testDB
MYSQL_USER: kedu
MYSQL_PASSWORD: P@ssw0rd
volumes:
- mariadb_data:/var/lib/mysql
volumes:
mariadb_data:
driver: local
# 백그라운드 실행
docker-compose up -d
# bash 실행하면서 접속
docker container exec -it mariadb-server /bin/bash
# 마리아DB 접속
mariadb -u root -p
# 데이터베이스 조회
SHOW DATABASES;
# 테이블 조회
SELECT User, Password, Host FROM mysql.user;
#DB 나가기, 컨테이너 종료
exit
# 컴포즈 실행되었던거 내리기
docker-compose down --rmi all
# 마운트 정보 확인하기
docker container inspect mariadb-server



cd /var/lib/docker/volumes/compose02_mariadb_data/_data

# 디렉토리 지정해서 파일
unzip fastapi_3tier_v3.zip -d 3tier/
# 파일 정리
mkdir static
mkdir dynamic
# 동적파일 정리
mv *.py dynamic
mv board/ dynamic/
mv member/ dynamic/
# 정적파일 정리
mv *.html static/
mv favicon.ico static/
mv js/ static/
mv css/ static/


여기서 WEB/WAS/DB 3Tier로 잡는다.
rockylinux:9.3.20231119
WEB
WAS
DB
# Dockerfile
touch web_config
touch was_config
touch db_config
# web_config
FROM rockylinux:9.3.20231119
RUN dnf update -y && dnf install -y httpd
# was_config
FROM rockylinux:9.3.20231119
RUN dnf update -y
RUN dnf install python3 python3-devel gcc -y
RUN pip3 install --user fastapi uvicorn sqlalchemy pymysql cryptography python-multipart
# db_config
FROM FROM rockylinux:9.3.20231119
RUN dnf update -y && dnf install -y mariadb-server
root@docker-00:~/3tier# vi docker-compose.yml
version: '2.0'
services:
web:
build:
dockerfile: web_config
context: .
container_name: web_server
ports:
- "80:80"
networks:
- 3tier
was:
build:
dockerfile: was_config
context: .
container_name: was_server
networks:
- 3tier
db:
build:
dockerfile: db_config
context: .
container_name: db_server
ports:
- "3306:3306"
networks:
- 3tier
root@docker-00:~# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.37.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x58ae295c.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p):
Using default response p.
Partition number (1-4, default 1):
First sector (2048-83886079, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-83886079, default 83886079):
Created a new partition 1 of type 'Linux' and of size 40 GiB.
Command (m for help): p
Disk /dev/sdb: 40 GiB, 42949672960 bytes, 83886080 sectors
Disk model: VMware Virtual S
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x58ae295c
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 83886079 83884032 40G 83 Linux
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
root@docker-00:~# mkfs.
mkfs.bfs mkfs.ext2 mkfs.ext4 mkfs.minix mkfs.ntfs
mkfs.cramfs mkfs.ext3 mkfs.fat mkfs.msdos mkfs.vfat
root@docker-00:~# mkfs.ext4
.Xauthority .docker/ 3tier/ htmldata/
.bash_history .lesshst compose01/ mountpoint/
.bashrc .profile compose02/ requirement.txt
.cache/ .viminfo docker/ snap/
.config/ 2.txt fastapi_3tier_v3.zip webapp/
root@docker-00:~# mkfs.ext4
.Xauthority .docker/ 3tier/ htmldata/
.bash_history .lesshst compose01/ mountpoint/
.bashrc .profile compose02/ requirement.txt
.cache/ .viminfo docker/ snap/
.config/ 2.txt fastapi_3tier_v3.zip webapp/
root@docker-00:~# mkfs.ext4 /dev/sdb1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 10485504 4k blocks and 2621440 inodes
Filesystem UUID: f3d9b4ab-e948-42a5-8d82-2ddb8ae2ed49
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624
Allocating group tables: done
Writing inode tables: done
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done
root@docker-00:~# mkdir /docker_data
root@docker-00:~# mount /dev/sdb1 /docker_data/
root@docker-00:~# df -h
파일 시스템 크기 사용 가용 사용% 마운트위치
tmpfs 387M 2.0M 385M 1% /run
/dev/sda3 20G 18G 980M 95% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 512M 6.1M 506M 2% /boot/efi
tmpfs 387M 96K 387M 1% /run/user/1000
tmpfs 387M 64K 387M 1% /run/user/0
/dev/sdb1 40G 24K 38G 1% /docker_data
root@docker-00:~# blkid | grep sdb1
/dev/sdb1: UUID="f3d9b4ab-e948-42a5-8d82-2ddb8ae2ed49" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="58ae295c-01"

init 6
vi /etc/docker/daemon.json
# 작성한 내용
{
"data-root": "/docker_data"
}
# 도커 재시작
systemctl restart docker
# 디스크 사용량 확인
df -h

docker-compose -f docker-compose.yml run -d

vi /etc/containerd/config.toml
17 root = "/docker_data/containerd"


systemctl restart containerd.service
systemctl restart docker
# 완료 전
root@docker-00:~# df -h
파일 시스템 크기 사용 가용 사용% 마운트위치
tmpfs 387M 2.0M 385M 1% /run
/dev/sda3 20G 19G 0 100% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 512M 6.1M 506M 2% /boot/efi
/dev/sdb1 40G 356K 38G 1% /docker_data
tmpfs 387M 96K 387M 1% /run/user/1000
tmpfs 387M 64K 387M 1% /run/user/0
# 완료 후
root@docker-00:~/3tier# df -h
파일 시스템 크기 사용 가용 사용% 마운트위치
tmpfs 387M 2.0M 385M 1% /run
/dev/sda3 20G 19G 0 100% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 512M 6.1M 506M 2% /boot/efi
/dev/sdb1 40G 253M 37G 1% /docker_data
tmpfs 387M 96K 387M 1% /run/user/1000
tmpfs 387M 64K 387M 1% /run/user/0
root@docker-00:~/3tier# vi docker-compose.yml
- 3tier
stdin_open: true
tty: true
was:
build:
dockerfile: was_config
context: .
container_name: was_server
networks:
- 3tier
stdin_open: true
tty: true
db:
build:
dockerfile: db_config
context: .
container_name: db_server
ports:
- "3306:3306"
networks:
- 3tier
stdin_open: true
tty: true
networks:
3tier:
driver: bridge
docker container exec -it web_server /bin/bash
systemctl status httpd
rpm -qa | grep httpd
vi /etc/httpd/conf/httpd.conf
# 변경한 내용
...
124 ProxyPass /api http://was-server:8000/api
125 ProxyPassReverse /api http://was-server:8000/api
126 DocumentRoot "/var/www/html"
저장
# ping test
dnf install -y iputils
ping was-server

# Static file
docker container cp static/. web_server:/var/www/html
# 확인
docker container exec -it web_server /bin/bash
ls -l /var/www/html/
# BACKGROUD 설정
ps -ef
ps aux
/usr/sbin/httpd -D BACKGROUND
# 파일 내용 확인
curl localhost



# service 파일 확인
ls -l /etc/systemd/system


# was 컨테이너 접속
docker container exec -it was_server /bin/bash
# dynamic file 모두 넣기
docker container cp dynamic/. was_server:/root
# 확인
cd ~
ls -l
# db_server로 핑테스트
dnf install -y iputils



nohup python3 main.py > out.log 2>&1 &

vi out.log
# 컨테이너를 나온다.
exit

# sql 파일 넣기
docker container cp webtest_DB.sql db_server:/root
# 데이터베이스 서버 접속
docker container exec -it db_server /bin/bash
# 백그라운드로 실행한다는 의미
mariadbd-safe --user=mysql &


# 데이터베이스 경로 설정
mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql/
# 백그라운드로 실행
mariadbd-safe --user=mysql &
# MariaDB ping test
mariadb-admin ping


# 명령어
mariadb-secure-installation
# 설정한 내용
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] Y
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
설치 완료!
# 로그인
mariadb -u root -p
# 모든 권한 주면서 유저 만들기
GRANT ALL PREVILEGES ON *.* TO 'kedu'@'%' IDENTIFIED BY 'P@ssw0rd';
FLUSH PRIVILEGES;
exit

# sql 파일 적용 해서 데이터베이스
mariadb -u kedu -p < webtest_DB.sql
# 데이터베이스 조회
mariadb -u kedu -p

vi /etc/my.cnf.d/mariadb-server.cnf
# 추가한 내용
21 bind-address=0.0.0.0
# db shutdown
mariadb-admin -u root -p shutdown
# safe 모드로 실행
mariadbd-safe --user=mysql &




DB는 mariadb:latest를 베이스로 사용한다.
Web config
ProxyPass/ProxyPassReverse 내용을 /etc/httpd/conf/httpd.conf라는 파일 안에 자동으로 작성한다.
COPY ./static/ /var/www/html은 정적 파일을 경로 내로 위치시킨다.
CMD 명령어로 컨테이너 시작과 동시에 httpd가 실행되도록 설정
FROM rockylinux:9.3.20231119
RUN dnf update -y && dnf install -y httpd
RUN dnf install -y iputils
COPY ./static/ /var/www/html
RUN echo -e "\n\
LoadModule proxy_module modules/mod_proxy.so\n\
LoadModule proxy_http_module modules/mod_proxy_http.so\n\
\n\
ProxyPass /api http://was_server:8000/api\n\
ProxyPassReverse /api http://was_server:8000/api\n" >> /etc/httpd/conf/httpd.conf
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
FROM rockylinux:9.3.20231119
RUN dnf update -y
RUN dnf install python3 python3-devel gcc -y
RUN dnf install -y iputils
RUN pip3 install --user fastapi uvicorn sqlalchemy pymysql cryptography python-multipart
WORKDIR /root
COPY ./dynamic /root
CMD python3 main.py > out.log 2>&1
# docker-compose.yml
version: '2.0'
services:
web:
build:
dockerfile: web_config
context: .
container_name: web_server
ports:
- "80:80"
networks:
- 3tier
stdin_open: true
tty: true
was:
build:
dockerfile: was_config
context: .
container_name: was_server
networks:
- 3tier
stdin_open: true
tty: true
db:
image: mariadb:latest
container_name: db_server
ports:
- "3306:3306"
networks:
- 3tier
stdin_open: true
tty: true
environment:
MARIADB_ROOT_PASSWORD: "P@ssw0rd"
MARIADB_ROOT_HOST: "%"
MARIADB_USER: "kedu"
MARIADB_PASSWORD: "P@ssw0rd"
MARIADB_DATABASE: "WebTest"
volumes:
- ./webtest_DB.sql:/docker-entrypoint-initdb.d/webtest_DB.sql:ro
- mariadb_data:/var/lib/mysql
volumes:
mariadb_data:
networks:
3tier:
driver: bridge


root@docker-00:~/3tier# ifconfig
br-4ad66b551a60: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
ether f2:5a:83:e9:c6:7b txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-73de6fd4db8b: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
ether 06:28:82:56:99:c8 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-a965985ee5f1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.20.0.1 netmask 255.255.0.0 broadcast 172.20.255.255
ether 5a:1c:d6:89:20:83 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-ff4c694ac537: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.21.0.1 netmask 255.255.0.0 broadcast 172.21.255.255
inet6 fe80::a802:55ff:fe66:30d0 prefixlen 64 scopeid 0x20<link>
ether aa:02:55:66:30:d0 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::d860:acff:fed1:588a prefixlen 64 scopeid 0x20<link>
ether da:60:ac:d1:58:8a txqueuelen 0 (Ethernet)
RX packets 283022 bytes 16741483 (16.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 354318 bytes 1173448548 (1.1 GB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.17.0.150 netmask 255.0.0.0 broadcast 10.255.255.255
ether 00:0c:29:85:5f:29 txqueuelen 1000 (Ethernet)
RX packets 1730210 bytes 2487588625 (2.4 GB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 473795 bytes 39635785 (39.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2680 bytes 448962 (448.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2680 bytes 448962 (448.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth628ce65: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::c00:3fff:fe22:5244 prefixlen 64 scopeid 0x20<link>
ether 0e:00:3f:22:52:44 txqueuelen 0 (Ethernet)
RX packets 102 bytes 10765 (10.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 249 bytes 26071 (26.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethc3e9abc: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::c48f:a8ff:fe6b:e98f prefixlen 64 scopeid 0x20<link>
ether 8a:2c:bf:6b:00:7c txqueuelen 0 (Ethernet)
RX packets 54 bytes 5114 (5.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 199 bytes 19863 (19.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethf4c44f4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::78c2:adff:fe80:e685 prefixlen 64 scopeid 0x20<link>
ether 7a:c2:ad:80:e6:85 txqueuelen 0 (Ethernet)
RX packets 84 bytes 7434 (7.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 227 bytes 25649 (25.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
watch -n 1 docker logs was-server