
도커란 ?
Docker: 애플리케이션을 컨테이너에 담아 어떤 환경에서도 동일하게 실행할 수 있게 해주는 플랫폼입니다.
컨테이너: 애플리케이션과 필요한 모든 요소를 독립된 환경으로 묶어 일관된 실행을 보장하는 가상화 기술입니다.
리눅스 커널에 있는 다음의 커널을 차용하여 만들었다.
Namespace: 애플리케이션마다 격리된 공간을 만들어 독립적으로 실행하게 합니다.
chroot: 컨테이너 내에서 root 권한으로 명령을 실행합니다.
cgroup: 각 컨테이너에 CPU, RAM 등의 리소스를 독립적으로 할당하고 관리합니다.
이렇게 Docker는 애플리케이션을 격리하고, 리소스를 효율적으로 사용할 수 있게 합니다.
touch docker.sh ; chmod +x docker.sh
#설치
#!/bin/bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
#./docker.sh 로 실행시킨다
버전 확인하여 설치하기
user1@lab:~$ apt-cache madison docker-ce | awk '{ print $3 }'
user1@lab:~$ VERSION_STRING="5:20.10.24~3-0~ubuntu-jammy"
user1@lab:~$ sudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin
테스트 컨테이너 생성하기
user1@lab:~$ docker container run --name nginx1 -d -p 8001:80 --restart always nginx
user1@lab:~$ docker container run --name httpd1 -d -p 8002:80 --restart always httpd
user1@lab:~$ docker pull rockylinux:8
user1@lab:~$ docker container run --name rocky1 -it --restart always rockylinux:8 /bin/bash
[root@b06744784004 /]#
[root@b06744784004 /]# whoami
root
[root@b06744784004 /]# cat /etc/redhat-release
Rocky Linux release 8.9 (Green Obsidian)
[root@b06744784004 /]#
전체 컨테이너 삭제를 위한 명령어 만들기
touch delctn && chmod +x delctn
vi delctn
#!/bin/bash
docker container rm -f $(docker container ls -aq)
echo "컨테이너가 모두 삭제되었습니다"
docker container ls -a
sudo mv delctn /usr/bin/delctn
컨테이너 종류

Docker는 주로 애플리케이션 컨테이너를 이용하여 서비스 환경을 구축합니다.
Docker 이미지는 특정 시점의 스냅샷으로, 불변의 읽기 전용 형태입니다. 수정이 필요하면 기존 이미지에 변경 사항을 더해 새 이미지를 생성해야 합니다.
Docker 이미지는 여러 레이어로 구성되어 있으며, 이를 기반으로 동일한 내용을 가진 컨테이너를 배포할 수 있습니다.
Quiz
3일전에 다운로드한 nginx 최신 이미지는 nginx:latest 라는 이름으로 로컬 저장소에 저장되어 있다. 뒤에 있는 latest 는 tag 라고 부르며 일종의 버전이름으로 사용된다. latest 는 최신 버전이라 할 수 있다. 그런데… 오늘 nginx:latest 다운받는다면 이 둘은 동일한 이미지 인가?
이 경우 3일전 이미지를 다운 받고 싶다면?
docker image pull elasticsearch@sha256:7cd88158f6…be5616a85fe556262dc864a
위와 같이 전에 이미지를 해시해 둔 해시 코드를 이용하여 다운로드 할 경우 일관성을 유지할 수 있다. 해당 정보는 아래와 같이 확인할 수 있다.

도커 명령어는 최초와 현재가 다를 수 있다.
예를들어 컨테이너 목록 확인 -> docker ps -> docker container ls
이미지를 삭제하고 싶다면? -> docker rmi -> docker image rm
컨테이너 삭제 -> docker rm -> docker container rm
도커 관련 명령어
[이미지]
docker search : 저장소에 있는 이미지를 검색
docker image pull : 저장소로부터 로컬 저장소로 이미지(각각의 레이어)를 다운로드 한다.
docker image history : 해당 이미지에 어떠한 설정등이 적용되 있는지를 시간순서로 확인
docker image inspect : 이미지의 상세정보 및 레이어 정보, 해시코드 등을 확인할 수 있다
[컨테이너]
일반적으로 컨테이너가 실행되는 과정

docker cotaniner ls : 목록확인(동작중인 컨테이너만 출력)
docker cotnainer ls -a : 동작,중지중인 모든 컨테이너 목록 출력
docker container ls -aq : 동작,중지중인 모든 컨테이너의 ID 만 출력
docker container run : 컨테이너를 생성하고 시작시킨다.
(docker container create + docker container start 는 안쓴다)
docker container rm : 컨테이너 삭제
docker container inspect : 컨테이너의 스펙, 상세 정보등을 확인할 수 있다.

user1@lab:~$ # nginx 컨테이너 > 백그라운드에서 실행 > 외부에 노출
user1@lab:~$ docker container run --name nginx1 -d -p 8080:80 nginx
d9d7756b6e1b431b62c6555de092a802164a637c3541d64203693458704216c0
user1@lab:~$
-애플리케이션 컨테이너
-백그라운드에서 동작중이다
-외부에 노출되어 ubuntu 의 8080 으로 접속하면 컨테이너의 80 으로 접속된다.
user1@lab:~$ docker container run --name rockylinux1 --hostname test1 -it rockylinux:8 /bin/bash
[root@test1 /]#
-os 컨테이너
-it 옵션을 이용하여 os 와 터미널로 상호통신 가능하다.
/bin/bash 컨테이너에게 /bin/bash 명령을 전달하여 bash 프롬프트가 실행된다.
–hostaname 은 컨테이너 내에서 사용할 컨테이너의 호스트 이름
-컨테이너에서 exit 를 하면 컨테이너가 중지된다.
-Ctrl + p, Ctrl + q 를 하면 중지 없이 나올 수 있다.
-다시 연결하고 싶다면
user1@lab:~$ docker container attach rockylinux1
[root@test1 /]#
[root@test1 /]# hostname -I
172.17.0.3
[root@test1 /]#
user1@lab:~$ # ssh 연결처럼 들어가지 말고 외부에서 컨테이너에게 명령어를 전달하고 값을 받고 싶다면?
user1@lab:~$ docker container exec rockylinux1 hostname -I
172.17.0.3
user1@lab:~$
도커 로그인 > docker hub 로 로그인을 하게되면 인증을 위한 api 와 인증정보를 아래의 파일이 암호화 되지 않은 상태로 저장시킨다.
user1@lab:~$ cat /home/user1/.docker/config.json
base64 라는 도구는 아래의 과정을 거쳐 기본 문자열을 난독화 시킨다.
문자열 > ASCII 코드로 변환 > binary 로 변환(2진수로 변환) > 6비트로 자른다 > base64 인코딩
도커 네트워크는 기본적으로 3가지 타입을 제공한다.


Bridge 모드:
컨테이너들은 독립된 네트워크(사설 주소)를 사용하지만, 외부 통신 시 호스트 주소로 변환(NAT/PAT)되어 나갑니다.
외부에서 컨테이너로 접근하려면 포트 매핑이 필요 (-p 호스트포트:컨테이너포트).
기본적으로 docker0라는 브리지 네트워크가 생성되어 사용됩니다.
Host 모드:
컨테이너가 호스트와 동일한 IP 주소를 사용하여 네트워크를 공유합니다.
외부에서 호스트의 IP 주소로 직접 컨테이너에 접근 가능. 보통 잘 사용되지 않음.
None 모드:
네트워크 연결을 제공하지 않습니다. 완전히 독립적인 네트워크가 없는 상태로 사용됩니다.
Overlay 모드:
클러스터 환경에서만 사용되며, 여러 노드에 걸쳐 컨테이너를 연결하고 터널링합니다.
기본 Docker 설정에서는 제공되지 않고, Swarm 등의 클러스터 환경에서 사용됩니다.
도커 볼륨