<httpd 서비스를 컨테이너에서 실행>
1. docker exec 컨테이너명 yum -y install httpd # 패키지 설치
2. docker exec -d 컨테이너명 httpd -D FOREGROUND # 서비스 실행
-> 서비스 실행시에 systemd가 존재하지 않아 systemctl start등을 사용하지 못한다. 즉, 임의적으로 실행시켜야 함
📗 "httpd -D FOREGROUND" : 임의적 실행
📗 -d (=detach) : 백그라운드로 실행
📗 패키지 설치할때 -y옵션을 사용하지 않으면 사용자와 커뮤니케이션을 요구하기 때문에 커뮤니케이션을 할 수 없는 exec명령어 특성상 설치가 되지 않는다
기본적으로 컨테이너에 생성되는 모든 파일은 컨테이너 레이어에 저장됨. 이 데이터들은 컨테이너와 함께 삭제되는 런타임 데이터인데, 이 데이터를 영구적으로 저장하려면 반드시 볼륨을 사용해야 함.
도커에서 볼륨을 사용하는 방법은 Bind Mount와 볼륨(Volume) 두 가지 방법이 존재
<Bind Mout에 관한 사용 사례>
1 . Bind Mount 사용 예시
mkdir bmdir1 # 바운드할 디렉터리
docker run -itd --name os1 -v /root/bmdir1:/root/bmdir centos:7
-> os1 컨테이너의 bmdir을 생성해 호스트의 bmdir1 디렉터리와 링크시킨다
-> 호스트의 bmdir1에 어떤 파일을 생성해도 os1의 bmdir에도 생성된다. 마찬가지로 os1의 bmdir에 어떤 파일을 생성해도 호스트의 bmdir1에 생성된다.
📗 만일 호스트의 해당 경로에 디렉터리가 없다면 비어있는 디렉터리 자동 생성 후 링크 시킨다
2 . Bind Mount 단점 : 컨테이너 경로 주의
docker run -itd --name os3 -v /root/bmdir1/:/root/ centos:7
-> 컨테이너의 위치를 root 디렉터리로 지정하게 되면 호스트의 bmdir1의 내용이 컨테이너의 root디렉터리에 덮어지게 된다.
-> 이때 root 디렉터리에 있어야 할 bash관련 파일들이 덮어지면서 없어진다
-> 따라서 prompt를 담당하는 bash파일들이 없어지면서 실제로 해당 컨테이너에 exec으로 접속하게 되면 prompt창이 바뀌어져 있는 것을 확인
-> cp를 이용해 다른 컨테이너의 root에 있는 .bashrc, .bash_profile을 다시 링크된 bmdir1에 넣으면 다시 prompt가 원래대로 돌아온다
1 . 볼륨 리스트 보기
docker volume ls
2 . 볼륨 생성 및 확인
docker volume create vol1 # 볼륨 생성
docker run -itd --name os5 -v vol1:/root/testdir centos:7
# 컨테이너 생성시 볼륨 생성
-> 호스트 대상 경로 앞에 '/' 없으면 volume 생성
-> '/' 있으면 Bind Mount 생성
ls /var/lib/docker/volumes/
# 생성한 볼륨은 기본적으로 해당 경로에 존재한다
docker inspect os1 | grep Type
# 볼륨의 타입이 Volume인지 Bind mount인지 확인
docker inspect vol1
# 도커 볼륨이 연결되어 있는 호스트 디렉터리의 위치 확인
-> inspect를 통해 볼륨에 관한 자세한 정보 확인 가능
3 . 볼룸 삭제
docker volume rm vol1
4 . DB에 volume 지정
docker run -itd --name mydb mysql:5.7
docker run -itd --name mydb1 -v dbvol:/root/testdir mysql:5.7
📗 host의 볼륨에 여러 컨테이너의 경로를 링크시켜주면 볼륨에 변경사항이 있을 때 여러 컨테이너들이 변경사항을 반영한다. 반대로 컨테이너 하나가 해당 경로에 변경사항이 생기면 호스트의 볼륨에 변경사항이 반영되면서 연결된 다른 컨테이너들도 변경사항이 반영된다
docker network ls # 도커 네트워크 확인
ip addr # docker 0가 있는 것을 확인
docker inspect bridge # docker 0 확인
1 . Bridge 생성 및 확인
docker network create --driver bridge docker1 # 네트워크 생성
docker network create --subnet 192.168.0.0/24 --gateway 192.168.0.1 docker2
docker inspect docker2 # 네트워크 스펙 확인(= 위 사진)
-> subnet을 지정해서 지정된 ip범위내에서 네트워크를 생성할 수도 있고, 게이트웨이를 지정할 수도 있다.
-> ip addr을 통해 생성한 network를 확인 가능
2 . 이전에 만든 네트워크를 탑재한 컨테이너 생성
docker run -itd --name os3 --network docker2 centos:7
-> docker2의 지정된 서브넷 범위 내에세 os2 컨테이너에 ip가 할당된 것을 볼 수 있다.
3 . 네트워크 삭제
docker network rm -f 네트워크
💡 컨테이너에 탑재되어 실행중인 네트워크는 삭제할 수 없다
-> 컨테이너를 삭제한 후 네트워크 삭제 가능
docker run -d --name web2 --network host httpd # host네트워크를 가진 컨테이너 생성
docker inspect web2 | grep IPA # host 네트워크 확인
-> 네트워크를 확인해보면 IP주소가 없는 것을 확인 = 컨테이너가 Host의 ip를 가져다 쓴다는 느낌
firewall-cmd --add-sevice=http --permanent
firewall-cmd --reload # 방화벽 해제
echo network host test > index.html
docker cp index.html web2:/usr/local/apache2/htdocs/ # index.html작성
-> 브라우저에 host의 ip를 입력하니 web1 컨테이너의 index.html의 text가 나타나는것을 확인
📒 host는 컨테이너 하나밖에 사용하지 못한다
docker run -itd --name os2 --network none centos:7 # null 네트워크 생성
docker inspect os2 | grep IPA # null 네트워크 확인
-> IP가 비어있는 것을 확인
docker exec os1 ping -c 3 web1
-> os1컨테이너에서 web1컨테이너에게 ping을 날리면 알 수 없다고 뜬다. 당연히 os1은 web1이 /etc/hosts파일에 등록되어 있지 않기 때문에 web1의 ip를 알지 못한다
docker exec -it os1 bash # os1 접속
vi /etc/hosts # /etc/hosts파일 작성
172.17.0.3 web2
-> /etc/hosts파일을 작성하면 ping이 보내진다. 하지만 이것을 일일이 하기에는 비효율적이다. 이때 사용하는 것이 link이다.
docker run -itd --name os2 --link web1 centos:7
# os2와 web1 link
docker exec os2 cat /etc/hosts
# os2의 /etc/hosts 확인
# 자동으로 web1에 대한 ip가 작성된 것을 볼 수 있다
docker exec os2 ping -c 3 web1
# ping이 작동하는 것을 확인
docker run -d --name web3 -p 8080:80 httpd
#web3에 대해 8080으로 포트포워딩
docker exec -it web3 bash
cd htdocs
cat > index.html
test port 8080 작성
#web3의 index.html text수정
-> 브라우저에 호스트ip:8080을 입력하니 web3에 접속되는 것을 확인
docker run -d --name web4 -p 8090:80 httpd
# web4에 대해 8090으로 포트포워딩
docker exec -it web4 bash
cd htdocs
cat > index.html
test port 8090 작성
# web4에 index.html text수정
-> 브라우저에 호스트ip:8090을 입력하니 web4에 접속되는 것을 확인
-> 위의 결과와 똑같은 호스트 ip를 입력했지만 포트를 구분하여 접속되는 컨테이너가 달라짐을 확인
< docker >
< docker-compose >
< 오케스트레이션 >