root@87d270ead910:/# apt-get update
root@87d270ead910:/# apt-get install apache2 -y
root@87d270ead910:/# service apache2 start
* Starting web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.3. Set the 'ServerName' directive globally to suppress this message
*
# 보시는 바와 같이 서버이름을 설정해주지 않아서 오류가 발생합니다.
grep ServerName /etc/apache2/apache2.conf
echo "ServerName localhost" >> /etc/apache2/apache2.conf
grep ServerName /etc/apache2/apache2.conf
service apache2 restart
참고사이트
호스트 IP의 80번 포트로 접근 -> 80번 포트는 컨테이너의 80번 포트로 포워딩 -> 웹 서버 접근
## 1. mysql 이미지를 사용해 데이터베이스 컨테이너
# http://127.0.0.1:52389/ ->
PS C:\Users\Playdata># docker run -d --name wordpressdb -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7
9ce9c6cddcc591a12085c3f902bf116f7d36e3a5d02379fc8eaf56ada925ddd4
## 2. 미리 준비된 워드프레스 이미지를 이용해 워드프레스 웹 서버 컨테이너를 생성
# database Connect 에러가 뜬다면 -e WORDPRESS_DB_USER=root 작성
PS C:\Users\Playdata># docker run -d -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=password --name wordpress --link wordpressdb:mysql -p 80 wordpress
c120fa257d843ceb250972dd54d8c837a5f2602c23a8b0265f70d8e482467ea0
# wordpress 실행 에러
# docker: Error response from daemon: Cannot link to a non running container: /wordpressdb AS /wordpress/mysql.
# -> wordpressdb 실행 후 실행하기
# error establishing a database connection 해결방법
docker run -e WORDPRESS_DB_USER=root 작성
p.32
C:\Users\mink>docker port wordpress
80/tcp -> 0.0.0.0:61735
# 컨테이너가 생성되고 종료된 상태
PS C:\Users\Playdata> docker run -d --name detach_test ubuntu:14.04
7c77ac6ece4e31b1f14d9863905d9c6ecbd469bf0d0681291393406e381a5379
PS C:\Users\Playdata> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7c77ac6ece4e ubuntu:14.04 "/bin/bash" 14 seconds ago Exited (0) 12 seconds ago detach_test
docker run -i -t --name mysql_attach_test -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress mysql:5.7
# exec 명령어를 사용하면 컨테이너 내부에서 명령어를 실행한 뒤 그 결과값을 반환받을 수 있음
# -i -t 옵션을 추가해 /bin/bash를 상호 입출력이 가능한 형태로 exec 명령어를 사용
PS C:\Users\Playdata> docker exec -i -t wordpressdb /bin/bash
root@9ce9c6cddcc5:/# echo $MYSQL_ROOT_PASSWORD
password
# 설정된 환경변수가 실제로 MYSQL에 사용됐는지 확인
# mysql -u root -p (password)
root@9ce9c6cddcc5:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.37 MySQL Community Server (GPL)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
# 실행됨
# wordpress wordpressdb를 둘 다 죽임
PS C:\Users\Playdata> docker stop wordpress wordpressdb
wordpress
wordpressdb
# 이유 : 컨테이너를 연결해주는 link는 실행 순서의 의존성도 정의해줌
PS C:\Users\Playdata> docker start wordpress
Error response from daemon: Cannot link to a non running container: /wordpressdb AS /wordpress/mysql
Error: failed to start containers: wordpress
이미 생성된 이미지는 어떠한 경우로도 변경되지 않으며, 컨테이너 계층에 원래 이미지에서 변경된 파일시스템 등을 저장.
이미지에 mysql을 실행하는데 필요한 애플리케이션 파일이 들어있다면 데이터베이스를 운용하면서 쌓이는 데이터가 저장
# mysql 데이터베이스 컨테이너 생성
# -v 옵션 : [호스트의 공유 디렉토리]:[컨테이너의 공유 디렉토리] 형태
# /var/lib/mysql 디렉터리는 MYSQL이 데이터베이스의 데이터를 저장하는 기본 디렉토리
PS C:\Users\Playdata> #docker run -d --name wordpressdb_hostvolume -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /home/wordpress_db:/var/lib/mysql mysql:5.7
2d2bd512e0082c534e78089c5ebdc3c56f88c225c1a22954c5c1cee1def1adc0
# 워드프레스 웹 서버 컨테이너 생성
# -p 옵션으로 컨테이너의 80포트를 외부로 노출
PS C:\Users\Playdata> #docker run -d -e WORDPRESS_DB_PASSWORD=password --name wordpress_hostvolume --link wordpressdb_hostvolume:mysql -p 80 wordpress
c70ba9c91d706e40939d44499b50c46cd313f3b6260445a115da951c2c691a8c
워드프레스 컨테이너에 -p 옵션으로 컨테이너의 80 포트를 외부에 노출했으므로 docker ps 명령어에서 확인한 wordpress_hostvolume 컨테이너의 호스트 포트로 워드프레스 컨테이너에 접속
-v 옵션 : [호스트의 공유 디렉토리]:[컨테이너의 공유 디렉토리] 형태
# 호스트에 이미 디렉터리와 파일이 존재하고 컨테이너에도 존재할 때 두 디렉터리를 공유하는 경우는?
# alicek106/volume_test 이미지활용
PS C:\> docker run -i -t --name volume_dummy alicek106/volume_test
Unable to find image 'alicek106/volume_test:latest' locally
latest: Pulling from alicek106/volume_test
56eb14001ceb: Pull complete
7ff49c327d83: Pull complete
6e532f87f96d: Pull complete
3ce63537e70c: Pull complete
587f7dba3172: Pull complete
Digest: sha256:e0287b5cfd550b270e4243344093994b7b1df07112b4661c1bf324d9ac9c04aa
Status: Downloaded newer image for alicek106/volume_test:latest
# /home/testdir_2/test 파일 존재확인
root@66ba8cf2b24a:/# ls /home/testdir_2/
test
# -v 옵션의 값인 /home/wordpress_db:/home/testdir_2 디렉터리를 확인하면 원래 존재했던 test파일이 없어지고
# 호스트에서 공유된 파일이 존재
# 정리 : -v 옵션을 통한 호스트 볼륨 공유는 호스트의 디렉터리를 컨테이너의 디렉터리에 마운트
PS C:\> docker run -i -t --name volume_overide -v /home/wordpress_db:/home/testdir_2 alicek106/volume_test
root@d13b9d4aa93e:/# ls /home/testdir_2/
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 performance_schema public_key.pem server-key.pem wordpress
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 mysql private_key.pem server-cert.pem sys
# 태그를 지정하지 않았는데 이미지가 pull된 것은 이미지의 태그를 지정하지 않으면
# 도커 엔진이 latest 태그로 지정된 이미지를 pull하기 때문
# -v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 것
# --volumes-from 옵션을 설정하면 -v 또는 --volume 옵션을 적용한 컨테이너의 볼륨 디렉터리를 공유
# 그러나 직접 볼륨 공유하는 것이 아닌 -v 옵션을 적용한 컨테이너 공유
# 앞에서 생성한 volume_overide 컨테이너에서 볼륨을 공유받는 경우
PS C:\> docker run -i -t --name volumes_from_container --volumes-from volume_overide ubuntu:14.04
root@bad4d8daee94:/# ls /home/testdir_2/
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 performance_schema public_key.pem server-key.pem wordpress
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 mysql private_key.pem server-cert.pem sys
docker volume 명령어 사용
이전 방식과 달리 도커 자체에서 제공하는 볼륨 기능 활용하여 데이터 보존
# create 명령어로 볼륨 생성
PS C:\> docker volume create --name myvolume
myvolume
# 볼륨 확인
# 여기서는 기본적으로 제공되는 드라이버 local사용
# **( 볼륨을 생성할 때 플러그인 드라이버를 설정해 여러 종류 스토리지 백엔드 가능)
# 이 볼륨은 로컬 호스트에 저장되며 도커 엔진에 의해 생성되고 삭제
PS C:\> docker volume ls
DRIVER VOLUME NAME
local myvolume
# [볼륨의 이름]:[컨테이너의 공유 디렉토리]
# /root/ 디렉터리에 마운트하므로 /root 디렉터리에 파일을 쓰면 해당 파일이 볼륨에 저장
PS C:\> docker run -i -t --name myvolume_1 -v myvolume:/root/ ubuntu:14.04
root@a590ba5d873b:/# echo hello, volume! >> /root/volume
# /root 디렉터리에 volume 파일 생성.
# 다른 컨테이너도 myvolume 볼륨을 쓰면 볼륨을 활용한 디렉터리에 volume 파일 존재.
# 파일 생성확인
PS C:\> docker run -i -t --name myvolume_2 -v myvolume:/root/ ubuntu:14.04
root@ab8199ba21f6:/# cat /root/volume
hello, volume!
# docker inspect를 사용하면 볼륨이 실제로 어디 저장되었는지 확인가능
# 컨테이너, 이미지, 볼륨 등 도커의 모든 구성 단위의 정보 확인할때 사용
# --type 옵션 : image, volume 등을 입력해야 좋게 명시됨
PS C:\> docker inspect --type volume myvolume
[
{
"CreatedAt": "2022-03-03T15:01:05Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
"Name": "myvolume",
"Options": {},
"Scope": "local"
}
]
# 도커의 모든 명령어는 docker 접두어 다음에 container, image, volume 등을 명시하고 특정 구성 단위를 제어하는 명령어 사용가능
# docker container inspect - 컨테이너 정보, docker volume inspect - 볼륨의 정보
# Drive는 볼륨이 쓰는 드라이버
# Label은 볼륨을 구분하는 라벨
# create를 별도로 쓰지않아도 -v 옵션을 입력해서 수행
# -v 옵션 : 볼륨을 자동 생성
# 도커 볼륨 이름을 지정해주지 않으면 무작위 16진수 형태인 볼륨이 자동 생성됨
PS C:\> docker run -i -t --name volume_auto -v /root ubuntu:14.04
PS C:\> docker volume ls
DRIVER VOLUME NAME
local f1e5bdae44b2ec3a089161c06d54c1d53ede8b73b1c8dd1775af696bf7eb0405
local myvolume
# -v 옵션 대신 --mount 옵션을 사용할 수 있다. 두 옵션의 기능은 같지만, 볼륨의 정보를 나타내는 방법이 다르기 때문에 둘 중 사용하기 편한 옵션을 사용하면 된다.
# 사용되지 않는 볼륨을 한꺼번에 삭제하려면 docker volume prune 명령어를 사용
C:\Users\mink>docker volume prune
#