도커 기본

#도커

https://www.slog.gg/p/13449

프로그램 (설치된) : 1 프로세스 : 실행중인 프로그램 : N

도커 이미지 (설치된) : 프로그램 집합체 : 1 도커 컨테이너 : 실행중인 이미지(OS) : N

docker run 하면 도커 이미지에 있는 프로그램 중 엔트리 포인트가 되는 프로그램만 실행됨 (전체가 실행되는 게 아님) 컨테이너가 하나씩 생성, 컨테이너 이름은 랜덤이지만 지정할 수 있음

호스트 OS => 도커가 설치된 컴퓨터 게스트 OS => 도커 컨테이너

도커 네트워크 : 도커 컨테이너끼리 통신할 수 있게 해주는 연결선 도커 볼륨 : 컨테이너가 사라져도 데이터를 지켜주는 보관함

모든 도커 환경 초기화

# 컨테이너 삭제
docker rm -f $(docker ps -qa)

# 이미지 삭제
docker rmi -f $(docker images -qa)

# 특정 이미지만 삭제
docker rmi ID

# 안쓰는 네트워크 삭제
docker network prune -f

# 안쓰는 볼륨 삭제
docker volume prune -f

도커 이미지 다운로드

# 도커 이미지 리스트(없음)
docker images

# 이름이 nginx:latest 인 이미지 다운로드
docker pull nginx:latest # 여기서 :latest 는 생략 가능

# 도커 이미지 리스트(nginx 가 리스팅 됨)
docker images

도커 이미지 실행(OS(컨테이너) 생성)

# 도커 이미지 리스트(없음)
docker run nginx

# 현재 내가 실행 중인 도커 컨테이너의 엔트리 포인트 프로그램을 강제 종료 하려면
Ctrl + C

# 현재 실행중인 도커 OS(컨테이너) 리스트(없음)
docker ps

# 모든 도커 OS(컨테이너) 리스트
docker ps -a

도커 컨테이너 삭제

# 모든 도커 OS(컨테이너) 리스트, 여기서 컨테이너 이름이나 ID 확인
docker ps -a

# 도커 컨테이너 삭제 by name
docker rm 컨테이너_이름

# 도커 컨테이너 삭제 by id
docker rm 컨테이너_ID

# 도커 컨테이너 삭제 by id with force
docker rm -f 컨테이너_ID

도커 컨테이너 정지 후 삭제

# 탭 1
## nginx 컨테이너 생성
docker run nginx

# 탭 2
## 컨테이너를 정지 후 삭제
docker ps # 컨테이너_이름 확인
docker stop 컨테이너_이름
docker rm 컨테이너_이름

# 탭 1
## nginx 컨테이너 생성
docker run nginx

# 탭 2
## 컨테이너를 강제로 삭제
docker ps # 컨테이너_이름 확인
docker rm -f 컨테이너_이름

쉘에서 명령어를 실행하면 해당 명령을 수행하는 자식 프로세스가 생성된다.

즉, 쉘 프로세스는 부모 프로세스가 되고, 실행된 명령은 자식 프로세스로 동작한다.

따라서, 부모 프로세스(쉘)가 종료되면 그 아래에서 실행 중이던 모든 자식 프로세스도 함께 종료된다.


일반적인 수행, find 프로세스가 쉘 프로세스의 자식으로 수행되고, Ctrl + C 로 끌 수 있다.

cd ~
find . \( -name "*.java" -o -name "*.html" \) -type f -exec grep -l "1" {} + # Ctrl + C

백그라운드 수행, find 프로세스가 쉘 프로세스의 자식으로 수행되지만 쉘이 꺼져도 유지 된다., Ctrl + C 로 끌 수 없다.

cd ~
nohup find . \( -name "*.java" -o -name "*.html" \) -type f -exec grep -l "1" {} +  & # Ctrl + C
cat nohup.log # 이 명령어로 해당 명령어의 결과를 볼 수 있다.
rm nohup.log # nohup.log 파일 삭제

nohup 명령어를 넣으면 백그라운드로 실행이 되서 쉘이 꺼져도 실행이 유지가 된다

백그라운드 프로세스를 강제 종료시키려면 kill 명령어를 사용해야 한다.

# 탭 1
cd ~
nohup find . \( -name "*.java" -o -name "*.html" \) -type f -exec grep -l "1" {} + & # Ctrl + C

# 탭 2
ps # find 와 관련된 프로세스 번호 확인
kill 9 find_명령의_프로세스_번호

포그라운드와 백그라운드의 차이

속성 포그라운드 백그라운드
관련 프로세스 포그라운드 프로세스 백그라운드 프로세스(데몬)
출력 바로 보임 바로 볼 수 없고, cat nohup.log 같은 명령으로 볼 수 있음
수명 비교적 짦음 길거나 명시적으로 끄지 않으면 죽지 않음
종료방법 프로세스를 강제로 끄거나(kill 9 프로세스 번호Ctrl + C 프로세스를 강제로 끔(kill 9 프로세스 번호)

도커에는 자체적인 데몬화(백그라운드 실행) 옵션이 있다

docker run -d nginx

docker ps

-d 명령어를 넣으면 백그라운드 실행 즉 데몬화가 된다.

포그라운드에서 실시간으로 볼 수 있었던 로그들을 백그라운드에서 보려면?

docker logs 컨테이너_이름 # 해당 컨테이너에서 발생한 모든 로그들을 출력
docker logs -f 컨테이너_이름 # 해당 컨테이너에서 발생한 모든 로그들을 출력 후 그 이후로 계속 출력되는 내용도 실시간으로 출력, Ctrl + C 로 종료가능
docker logs --since 1m30s 컨테이너_이름 # 해당 컨테이너에서 발생한 로그들 중에서 최근 1분30초 사이에 발생한 로그들만 출력

도커 컨테이너의 이름은 중복될 수 없다 –name 옵션으로 이름 설정이 가능하다

docker run -d --name nginx-1 nginx # 이름이 nginx-1 인 컨테이너 생성 # 성공
docker run -d --name nginx-1 nginx # 이름이 nginx-1 인 컨테이너 생성 # 이번에는 실패, 똑같은 이름을 가진 컨테이너가 존재할 수 없음
docker rename nginx-1 nginx-2 # 이름이 nginx-1 인 컨테이너의 이름을 nginx-2 로 변경

도커 컨테이너는 OS이다. 해당 OS에 명령을 날리고 싶다면?

pwd # 윈도우 or MAC 에서 수행
ls # 윈도우 or MAC 에서 수행
docker exec nginx-1 ls # nginx-1 운영체제에서 수행
docker exec nginx-2 ls # nginx-1 운영체제에서 수행

exec 옵션을 넣어도 복잡한 명령어는 Abort된다 해결 방법은?

docker exec nginx-1 apt-get update # OK
docker exec nginx-1 apt-get install vim # Abort, 왜냐하면 복잡한 명령이라서
docker exec -it nginx-1 apt-get install vim # Abort, OK
Y 엔터
exit

도커 컨테이너에 명령을 넣으려면 exec nginx-1를 계속 반복해서 쳐줘야 하는 번거로움이 있다.

아예 해당 도커 컨테이너로 접속해서 명령을 날리고 싶다면?

docker exec -it nginx-1 bash
exit

docker exec -it nginx-1 sh
exit

docker exec -it nginx-1 bash
atp-get update
apt-get install -y net-tools
exit

이미지 또는 컨테이너 정보를 확인하고 싶을 때

docker inspect 이미지_이름
docker inspect 이미지_이름 | fgrep 키워드 # `docker inspect 이미지_이름` 한 결과에서 `키워드` 가 포함된 줄만 추려서 보여줌
docker inspect 이미지_이름 | less # 방향키(상하좌우)로 편하게 출력결과를 볼 수 있음, `q` 로 종료

docker container inspect 컨테이너_이름
docker container inspect 컨테이너_이름 | fgrep 키워드
docker container inspect 컨테이너_이름 | less

도커의 기본 네트워크 이름은 bridge 이고 172.17.0.1이다

docker network ls # bridge, host, none 이렇게 3개의 기본적인 네트워크가 있고 bridge 가 디폴트 네트워크 입니다.

docker container inspect nginx-1 | fgrep IPAddress # IPAddress: 172.17.0.2
docker container inspect nginx-2 | fgrep IPAddress # IPAddress: 172.17.0.2

도커 호스트 == OS 도커 게스트 == 컨테이너

컨테이너의 입장에서 호스트에 접근하고 싶다면 172.17.0.1로 접근할 수 있다.

=> 무조건은 아님 도커의 기본 네트워크인 브릿지 네트워크에서는 세팅이 되어 있음


172.17.0.1 는 기본 네트워크가 아닌 다른 네트워크 안에 포함된 컨테이너들에게는 의미가 없다.

docker network ls
docker network create common # 이름이 `common` 인 네트워크 생성
docker network ls

docker network inspect bridge | less # 디폴트 네트워크의 상세정보 보기, 게이트웨이가 172.17.0.1 임을 확인
docker network inspect common | less # 디폴트 네트워크의 상세정보 보기, 게이트웨이가 172.18.0.1 임을 확인

127.0.0.1은 무조건 도커 호스트를 뜻하지 않는다. 각 OS(컨테이너 포함)는 127.0.0.1 이 자신을 가리킨다

docker exec -it nginx-1 bash
apt-get update
apt-get install -y iputils-ping

ping 127.0.0.1 # nginx-1 본인에게 ping
ping 172.17.0.1 # 도커호스트에게 ping
ping 172.17.0.2 # nginx-1 본인에게 ping
ping 172.17.0.3 # nginx-2 에게 ping
exit

커스텀 네트워크에서는 서로를 IP뿐 아니라 컨테이너 이름으로 식별할 수 있다

docker run -d --name nginx-3 --network common nginx # common 네트워크에 nginx-3 생성
docker run -d --name nginx-4 --network common nginx # common 네트워크에 nginx-4 생성

docker exec -it nginx-3 bash
apt-get update
apt-get install -y iputils-ping

ping 127.0.0.1 # nginx-3 본인에게 ping
ping 172.18.0.1 # 도커호스트에게 ping
ping 172.18.0.2 # nginx-1 본인에게 ping
ping 172.18.0.3 # nginx-2 에게 ping
ping nginx-1 # nginx-1 본인에게 ping
ping nginx-2 # nginx-2 에게 ping
exit

네트워크 상관없이 도커호스트에게 접근하는 방법

docker run --add-host host.docker.internal:host-gateway nginx 
# host.docker.internal 가 안되는 환경에서는 
`--add-host host.docker.internal:host-gateway` 옵션을 추가하면 됩니다.

[!check] ping host.docker.internal 는 도커 데크스탑으로 도커를 설치한 경우에만 가능하다.

This line appears after every note.

Notes mentioning this note

There are no notes linking to this note.


Here are all the notes in this garden, along with their links, visualized as a graph.