도커 기본
#도커
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.