컨테이너 관리
(1) 컨테이너 접근 및 실행
분리 모드로 실행중인 컨테이너에 접근하거나 컨테이너에 직접 접근하지 않고 명령을 실행하는 방법이 있음.
1) docker attach
표준 입력, 표준 출력/에러를 포함하는 컨테이너에 연결할 수 있다.
docker restart os2 >> os2 컨테이너 실행
docker ps >> 실행중인 컨테이너 확인

docker attach os2

ctrl 누른상태에서 p랑 q를 한번씩눌러주면 컨테이너 실행중인 상태에서 나갈수가 있음
exit로 나가면 컨테이너가 종료됨
docker attach 명령으로 쉘 프로그램 외에 애플리케이션을 실행하고 있는 컨테이너에 접그하면 쉡이 나타날 거라 생각할 수 있다. 그러나~ 컨테이너는 기본적으로 쉘 플그램을 실행하고 있지 않으므로 docker attach로 접근하지 않는 것이 좋다.!!!!
2) docker exec
실행중인 컨테이너에서 명령을 실행할 수 있다.
쉘 없는 이미지에서 많이 사용가능!!!!
docker exec os2 hostname >> os2컨테이너 안에서 hostname 명령어 실행하기
docker exec ip a s >> os2컨테이너 에서 ip a s 명령어 실행

docker exec도 docker run과 같이 -it 옵션을 사용할 수 있다.
docker exec -it web2 bash ( 쉘이 없는 프로그램에서 쉘을 실행할때)

나올떄는 exit로 나오기
(2) 컨테이너 프로세스 및 로그 확인
컨테이너에서 실행중인 프로세스와 로그를 확인할 수 있다.
1) docker top
컨테이너에서 실행되는 프로세스의 정보를 확인할 수 있다.
docker top os2

2) docker logs
컨테이너의 로그를 확인할 수 있다.
docker run -d --name db1 mysql:5.7 >> mysql:5.7 이미지로 db1 컨테이너를 실행한 뒤 로그를 확인한다.
docker ps -a 로 db1컨테이너의 상태를 확인해보면 바로 종료되있음

원인을 찾기 위해 docker logs 명령을 사용해보자
docker logs db1

You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
중하나를 지정해야 하는 것을 알 수 있다.
환경변수를 설정해 db2 컨테이너로 다시 실행해보자
docker run -d --name db2 -e "MYSQL_ROOT_PASSWORD=1234" mysel:5.7
docker ps 명령어를 통해 db2 컨테이너가 실행중인지 확인

실행중인것을 확인할수 있다.
(3) 컨테이너에 파일 복사 및 확인
호스트에 있는 파일을 컨테이너에 복사하거나 반대로 작업할 수 있다. 또한 컨테이너의 파일시스템 중 어느 것이 변경되었는지 알 수 있는 명령어도 있다.
1) docker cp
호스트의 파일을 컨테이너로 복사하거나 컨테이너의 파일을 호스트로 복사하거나 컨테이너의 파일을 호스트로 복사할 수 있다.
docker cp web2:/usr/local/apache2/htdocs/index.html /tmp/index.html >>> web2 컨테이너의 /usr/local/apache2/htdocs/index.html 파일을 호스트의 /tmp/index.html로 복사한다.

명령 실행후 호스트에서 해당 파일을 확인한다
cat /tmp/index.html

2) docker diff
컨테이너에서 파일의 변경 상태를 체크한다.
A : 파일이 추가됨
B : 파일이 변경됨
C : 파일이 삭제됨

디렉토리에 안의 파일이 생성되거나 삭제되면 C로 표시된다.
4장 도커 볼륨
기본적으로 컨테이너에 생성되는 모든 파일은 컨테이너 레이어에 저장됨, 이 데이터들은 컨테이너와 함께 삭제되는 런타임 데이터인데, 이 데이터를 영구적으로 저장하려면 반드시 볼륨을 사용해야 됨
1) bind mount
초기 도커부터 사용한 방식, 호스트의 특정 디렉토리와 컨테이너의 디렉토리를 연결하는 방식.
bind mount는 쉽게 사용할 수 있지만 도커에 의해 관리되지 않기 떄문에 기록하지 않으면 관리가 어려움.....
또한 호스트의 파일 시스템에 대한 의존도가 높다. bind mount는 호스트의 민감한 파일까지 접근할 수 있으믕로 보안 측면인 문제가 발생할 수 있다.
bind mount 실습
호스트에 mkdir ~/bm1 >> bm1디렉토리 생성
touch ~/bm1/filea.txt >> 파일생성

실행중인 컨터이너에는 bind mount를 연결할 수 없고, 반드시 컨테이너를 실행하거나 생성하면서 연결해야됨.
컨테이너에 bind mount를 사용하려면 docker run 명령어중 -v 옵션을 사용한다
docker run -itd --name os3 -v ~/bmi:/tmp/mount centos:latest >>> os3 컨테이너를 실행하면서 컨테이너의 /tmp/mount 디렉토리와 호스트의 ~/bm1 디렉토리를 bind mount로 연결한다
연결 완료시 exec 명령으로 /tmp/mount 디렉토리에 filea.txt 파일이 있는지 확인해보자
docker exec os3 ls /tmp/mount

docker attach os3 >> os3로 들어가서
cd /tmp/mount
touch abcd >>> abcd파일 추가
다시 ctrl + p + q로 나와서
ls ~/bm1 확인

파일이 생성된것을 확인할수 있다
2) 볼륨(volume)
도커에 의해 관리되는 스토리지, docker 명령을 사용해 생성할 수 있고, 사용되지 않으면 한꺼번에 삭제할 수 있다.
이미지의 volumes 부분에 어떤 값이 지정되어 있으면, 컨테이너로 실행할 떄 볼륨을 지정해야됨
볼륨은 bind mount와 다르게 다양한 드라이버를 지원한다.
볼륨실습
docker volume >>> 볼륨생성 명령어
docker volumn create vol1 >>> vol1 볼륨을 생성하는 명렁어
docker volume ls >>> 호스트의 모든 도커 볼륨을 확인할 수 있다.

docker inspect 명령을 사용하여 도커 볼륨이 연결되어 있는 호스트 디렉터리의 위치를 알 수 있다.
docker inspect vol1

bind mount와 마찬가지로 도커 볼륨도 컨테이너 실행하거나 생성시 볼륨을 연결해야됨, 옵션은 동일하다
docker run -itd --name os4 -v vol1:/tmp/volume centos:latest >>> centos:latest 이미지로 os4 컨테이너를 실행하면서 vol1 볼륨을 os4의 /tmp/volume에 연결한다.
docker run -itd --name os5 -v vol2:/tmp/volume centos:latest >>> 만약 vol2 처럼 없는 볼륨이면 알아서 생성이됨

자동으로 vol2 볼륨이 생성된것을 확인!!!

볼륨을 삭제하는 명령어 >>> docker volume rm os5
자이제 본론으로 돌아와서 현재 vol1에는 아무런 데이터가 없기에 os4 컨테이너의 /tmp/volume의 내용을 확인해도 아무것도 없을 것이다. 여기에 httpd:latest 이미지로 web3 컨테이너를 생성하면서 vol1을 연결해보자 이떄 web3는 vol1에 읽기 전용으로 연결된다.
docker run -d --name web3 -v vol1:/usr/local/apache2/htdocs:ro httpd:latest
docker exec os4 cat /tmp/volume/index.html >> 확인하는 명령어

도커 네트워크
(1) 네트워크 유형
도커에는 다양한 네트워크 드라이브가 있으며, 용도에 맞게 드라이버를 선택하여 사용한다.
기본 네트워크 드라이버는 bridge, host, null이 있음, docker network ls 명령으로 목록을 확인할 수 있다.
docker network ls

1) bridge
컨테이너가 사용하는 프라이빗 네트워크, 같은 bridge에 연결되어 있으면 컨테이너의 ip주소로 통신할 수 있다. 외부로 통신할 때에는 NAPT 통신을 사용하며, 외부에서 bridge로 통신하려면 포트포워딩을 사용해야 한다.
도커를 설치하면 docker0 라는 이름의 리눅스 브릿지가 생성됨, 이는 docker netowrk ls 명령의 출력 중 이름이 bridge인 네트워크와 동일하다.
docker inspect bridge >>> Docker의 기본 네트워크인 "bridge" 네트워크에 대한 상세 정보를 출력
마지막 Options 섹션에 bridge 너트워크의 옵션들이 나열되어 있는데 그중 연결되어 있는 브릿지는 docker라고 나와있다.

bridge 드라이버를 사용하는 네트워크는 여려 개 생성할 수 있으며 docker netowrk create 명령을 사용한다.
docker network create --subnet 192.168.100.0/24 --gateway 192.168.100.254 net1
docker network ls 로 네트워크가 생성되었는지 확인

docker run -itd --name os5 --network net1 centos:latest >>> net1을 사용하는 os5 컨테이너를 생성한다.
컨테이너가 지정된 네트워크를 사용하게 하려면 docker run 명령에 --network 옵션을 사용한다.
2) host
호스트에서 컨테이너의 네트워크 격리를 해체해 호스트의 네트워크 정보를 공유해서 사용하는 방법!!
컨테이너는 호스트입장에서 하나의 프로세스이기 때문에 가상머신과 다르게 네트워크 정보를 공유할 수 있다.
컨테이너가 이 네트워크를 사용할 떄 컨테이너의 포트가 호스트에서 사용하는 포트와 충돌해서는 안 된다.
docker run -d --name web4 --network host httpd:latests >>> host 드라이버를 사용하는 web4 컨테이너를 생성한다.
bridge 드라이버를 사용하는 컨테이너는 curl 명령으로 웹 서버에 접그하려면 ip주소를 알아야했지만 web4 컨테이너는 localhost로 조회 가능

3) null(none)
null 드라이버는 컨테이너의 네트워크 기능을 사용하지 않음. 이 드라이버는 사용자 정의 네트워크 드라이버와 함께 사용한다.
docker run -it ---name os6 -rm --network none centos:latest ip a s >>> null드라이버를 사용하는 os6 컨테이너를 실행하면서 ip a s 명령을 실행하고 종료한다.

4) overlay
서로 다른 도커 호스트를 연결하여 통신할 수 있도록 한다. 쉽게 말해 서로다른 도커 호스트의 컨테이너가 서로 통신할 수 있다. 따라서 단일 호스트인 경우에 사용하지 않음, 도커 스웜과 같은 클러스터 서비스에 사용된다.
5) macvlan
MAC주소를 컨테이너에 할당하여 도커 데몬이 트래픽을 컨테이너의 MAC 주소로 라우팅할 수 있게 한다. 이 드라이브는 호스트이 네트워크를 통해 라우팅 하는것이 아니라 컨테이너가 실제 네트워크에 직접 연결해야 할떄 사용!!
1. 아이피 확인
macvlan 드라이버를 사용하려면 호스트의 인터페이스 중 하나의 네트워크 주소를 알아야 한다. 컨테이너는 이 인터페이스와 같은 네트워크 대역의 ip를 할당 받기 떄문이다.

gateway 주소확인 ip route 명령으로 확인

2. macvlan 네트워크 생성
docker network create -d macvlan --subnet=10.0.2.0/24 --gateway=10.0.2.1 -o parent=enp0s3 macvlan1
docker network ls >>> 네트워크가 생성되었는지 확인

3. macvlan 드라이버를 사용하는 컨테이너 생성
docker run -itd --name os6 --network macvlan1 centos:latest
docker inspect os6 | grep -i ipaddress >>> 컨테이너가 생성되면 IP주소를 확인

4. 기능 확인
컨테이너의 ip로 ping 명령을 실행하여 확인한다.
ping -c3 10.0.2.2

5. 컨테이넌 삭제
기능이 확인되었으면 컨테이너를 삭제하자
docker rm -f os6
컨테이너의 통신
1) 링크
컨테이너 끼리 서로 통신하려면 기본적으로 같은 bridge 드라이버 네트워크를 사용한다. 그리고 종종 컨테이너 간 이름 또는 별칭으로 통신해야 하는 경우도 있는데 이런 경우에 링크 기능을 사용!!!
docker run -itd --name os6 --link web3 centos:latest >>> os6 컨테이너가 web3와 통신할 떄 링크를 사용한다
docker exec os6 curl web3 >>> os6 컨테이너에 접근하여 curl 명령으로 확인한다.

os6 컨테이너가 web3라는 이름으로 통신할 수 있는 이유는 /etc/hosts 파일에 정의되어 있기 때문이다. 다음은 os6 컨테이너의 /etc/hosts 파일의 내용을 출력한다.
docker exec os6 cat /etc/hosts

--link 옵션으로 컨테이너 이름 뿐만 아니라 별칭을 사용할 수도 있다. 다음은 os7 컨테이너가 web3 컨테이너에 접근하라 떄 apache 라는 별칭을 사용하라 수 있도록 한다.
docker run -itd --name os7 --link web3:acache centos:latest

/etc/hosts

2) 포트 포워딩(docker run -p)
브릿지 네트워크를 사용하는 모든 컨테이너는 외부에서 접근할 때 포트포워딩 을 해야 한다.
docker run -d --name web5 -p 8080:80 httpd:latest >>> web5 컨테이너를 실행하면서 호스트의 8080포트로 접근했을 떄 컨테이너의 80번 포트로 전달하는 포트포워딩 설정
포트포워딩이 설정되면 docker ps 명령의 PORTS 필드 값이 이전과 다른 것을 알 수 있다.

0.0.0.0은 호스트의 ip를 나타내며 :8080은 호스트의 포트를 나타낸다. 포트포워딩이 설정되면 로컬호스트 뿐만 아니라 이 호스트에 접근할 수 있는 모든 시스템에서 접근 가능하다

'Docker(도커)' 카테고리의 다른 글
| Docker 이미지와 컨테이너 백업/복원 정리 (0) | 2025.12.18 |
|---|---|
| 도커 이미지 저장 및 로드 (0) | 2024.12.12 |
| 도커 실습연습(wordpress 사이트를 docker로 구축) (1) | 2023.06.29 |
| 도커(3일차) (0) | 2023.06.29 |
| 도커(1일자) (0) | 2023.06.26 |