Skip to content

Instantly share code, notes, and snippets.

@98yejin
Last active February 18, 2024 04:15
Show Gist options
  • Save 98yejin/93dacda92e15aca0afa36d8e9aa886e6 to your computer and use it in GitHub Desktop.
Save 98yejin/93dacda92e15aca0afa36d8e9aa886e6 to your computer and use it in GitHub Desktop.

도커 명령어

  • 도커허브에서 이미지 검색 docker search 이미지명

  • 이미지 다운로드 docker pull 이미지명:태그

  • 이미지 리스트 확인 docker image ls or docker images

  • 이미지 ID 리스트 확인 docker image ls -q or docker images -q

  • 이미지 삭제 docekr image rm [-f] 이미지명 -f 옵션은 컨테이너가 실행되었던 이미지 삭제시

  • 컨테이너가 실행되지 않았던 이미지 삭제 docker image prune

  • 컨테이너가 실행되었던 이미지 삭제 docker image rm -f $(docker images -q)

  • 이미지 백업 docker save -o 백업파일명 이미지명 이미지명 ....

  • 이미지 백업 파일 해제 docker load -i 백업파일명

  • 컨테이너 생성 및 실행 docker run [option] --name 컨테이너명 이미지:태그

옵션

-it : 입력값과 출력값이 필요로 하는 컨테이너 경우에 붙임

-d : 입력값이나 출력값이 필요없고 실행만 시킬 경우에 붙임

  • 컨테이너 list 확인 docker ps [-a] -a : 종료된 컨테이너까지 확인

  • 컨테이너 삭제 docker container rm [-f] 컨테이너명 -f : 실행되고 있는 컨테이너 삭제시 붙임

  • 컨테이너 시작 및 정지 docker container start / stop 컨테이너명

  • 컨테이너 및 이미지 스펙 확인 docker inspect 컨테이너명/이미지명

  • 컨테이너 리소스 확인 docker stats [옵션] --no-stream : 1회성으로 띄울 때

  • 컨테이너 리소스 제한 docker run --cpus (0.0~1.0) --memory (메모리크기) [옵션] --name 컨테이너명 이미지명:태그

  • 컨테이너 리소스 변경 docker update --cpus or --memory (limit 제한) 컨테이너명

  • 컨테이너 PID 확인 docker top 컨테이너명

  • 컨테이너 빠져나오기 ctrl p q 차례대로 입력

  • 컨테이너 재진입 docker attach 컨테이너명

  • 컨테이너 분리모드로 실행 docker exec -it 컨테이너명 실행명령어

-도커 파일 복사 컨테이너 -> 호스트 docker container cp 컨테이너명:PATH 호스트 PATH

호스트 -> 컨테이너 docker container cp 호스트_PATH 컨테이너명:PATH

-컨테이너 파일 변경 현황 docker diff 컨테이너명

-도커 볼륨

bind-mount
docker run [옵션] -v 호스트_PATH:컨테이너_PATH 컨테이너명

volume 생성

docker volume create 볼륨명
ls /var/lib/docker/volume/볼륨명/_data

volume 마운트 docker run [옵션] 볼륨명:컨테이너_PATH 컨테이너명

volume 리스트 확인 docker volume ls


1. 도커를 설치해보시오.

# yum 관리 도구 설치
yum install -y yum-utils
# docker 레포지터리 추가
yum-config-manager  --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 도커 설치
yum install docker-ce docker-ce-cli containerd.io

설치한 도커를 활성화 하려면 systemctl enable docker --now 또는

systemctl enable docker
systemctl start docker

를 입력하면 된다.

도커의 상태를 확인하려면

systemctl status docker # 활성화 여부 확인
docker --version # 설치 확인

를 입력하면 된다.

2. ubuntu , mysql:5.7 , dokken/centos-7 , httpd 이미지 설치

# docker search image_name

docker pull ubuntu
docker pull mysql:5.7
docker pull dokken/centos-7
docker pull httpd

3. 해당 이미지들 이름은 차례로 os1, mydb, centos7 , web1 , web2 로 httpd만 2개 container 실행

docker run -itd --name os1 ubuntu:latest
docker run -d --name mydb mysql:5.7
docker run -itd --name centos7 dokken/centos-7
docker run -d --name web1 httpd
docker run -d --name web2 httpd

4. mysql:5.7 의 WorkingDir 확인

docker inspect mydb | grep WorkingDir

5. web1과web2의 아이피 주소 확인

docker inspect web1 | grep IPA
docker inspect web2 | grep IPA

6. web2 container 종료후 다시 시작해 볼 것

docker container stop web2
docker ps | grep web2
docker container start web2
docker ps | grep web2

7. mysql:5.7의 이미지를 container까지 삭제하시오.

docker image rm -f mysql:5.7

8. 전체 container 확인

docker ps 
docker ps -a

9. ubuntu와 centos 의 백업본을 만들고 기존 이미지 삭제 백업을 이용해서 이미지를 다시 생성해보시오.

docker save -o backup.tar ubuntu:latest dokken/centos-7
ls 
docker image rm -f ubuntu:latest 
docker image rm -f dokken/centos-7
docker images
docker load -i backup.tar
docker images   

10. ubuntu 와 centos 다시 container 실행

docker run -itd --name os1 ubuntu:latest
docker run -itd --name centos7 dokken/centos-7
docker ps

11. container 들에 대한 상태를 확인하되 실시간이 아니도록 하시오.

docker stats --no-stream

12. ubuntu에 분리모드로 접속해서 /var/log/의 내용을 보도록 하시오.

docker exec -it os1 ls /var/log

13. 이미지 httpd ubuntu 백업해볼 것

docker save -o backup.tar httpd ubuntu

14. httpd ubuntu 이미지 삭제 후에 백업파일 해제

docker image rm httpd
docker image rm ubuntu
docker load -i backup.tar

15. centos httpd ubuntu mysql:5.7 이미지로 컨테이너 실행(os 컨테이너는 실행만 되도록 하시오.)

docker run -itd --name os1 centos
docker run -d --name web1 httpd
docker run -d --name web2 httpd
docker run -itd --name os2 ubuntu
docker run -d --name mydb mysql:5.7

16. mydb WorkingDir 위치 확인

docker inspect mydb | grep WorkingDir

17. mydb 컨테이너 삭제

docker container rm mydb

18. ubuntu 이미지로 os3 컨테이너 실행( cpu 사용률 : 40%로 제한, 메모리 : 512m 으로 제한)

docker run --cpus 0.4 --memory 512m -itd --name os3 ubuntu
docker stats --no-stream

19. os3 컨테이너 리소스 수정 (메모리 : 1024m)

docker update --memory 1024m os3
docker stats --no-stream

20. web1로 시작하는 위치를 분리모드로 출력해보시오.

docker exec web1 pwd

21. os1에 재접속해보시오.

docker attach os1

22. web3 컨테이너를 생성

docker run --name web3 -d httpd

23. web3 의 웹페이지 내용 확인

docker inspect web3 | grep IPA
curl ip 주소

24. web3 컨테이너의 파일 변경 사항 확인

docker diff web3

25. 호스트에서 "cp test" 내용을 가진 index.html을 생성

echo "cp test" > index.html

26. 호스트에서 "diff test" 내용을 가진 index1.html을 생성

echo "diff test" > index1.html

27. web3의 /usr/local/apache2/htdocs/ 에 생성한 index.html 파일을 복사

docker container cp index.html web3:/usr/local/apache2/htdocs/
docker container cp index1.html web3:/usr/local/apache2/htdocs/

28. web3 의 웹페이지 내용 확인

curl ip주소

29. 호스트의 index.html 삭제 후에 web3의 index.html 파일을 호스트 현 디렉토리에 복사

rm -f index.html
ls
docker container cp web3:/usr/local/apache2/htdocs/index.html ./
ls

30. web3의 index1.html 삭제 후에 파일 변경 사항 확인

docker diff web3
docker exec web3 rm /usr/local/apache2/index1.html
docker diff web3
# => index1.html 항목이 없어짐

31. web3의 index.html 삭제 후에 파일 변경 사항 확인

docker diff web3

docker exec web3 rm /usr/local/apache2/index.html

docker diff web3
# => index.html 항목이 C => D로 변경됨

32. 호스트 홈 디렉토리에

(1) fileA 파일 생성

touch fileA

(2) dirA 디렉토리 생성

mkdir dirA

(3) host 디렉토리에

index.html => "/root/ dir"
echo "/root/ dir" > index.html

(4) dirA 디렉토리 안에

index.html => "/root/dirA dir"
echo "/root/dirA dir" > dirA/index.html

(5) 모든 컨테이너 삭제(실행되고 있는 컨테이너도 삭제)

docker container rm -f $(docker ps -qa)

(6) httpd 이미지로 컨테이너 생성

web1 : 호스트의 홈 디렉토리와 /usr/local/apache2/htdocs/ 매칭

docker run -d --name web1 -v ~/:/usr/local/apache2/htdocs/ httpd
docker inspect web1 | grep -A 10 Mounts

web2 : 호스트의 /root/dirA 와 /usr/local/apache2/htdocs/ 매칭

docker run -d --name web2 -v ~/dirA/:/usr/local/apache2/htdocs/ httpd
docker inspect web2 | grep -A 10 Mounts

web3 : 도커볼륨 dirB 와 /usr/local/apache2/htdocs/ 매칭

docker run -d --name web3 -v dirB:/usr/local/apache2/htdocs/ httpd
docker inspect web3 | grep -A 10 Mounts

web1 의 /usr/local/apache2/htdocs/ 내용 확인

docker exec web1 ls /usr/local/apache2/htdocs/
# => ls /root/ 결과와 동일

web2 의 /usr/local/apache2/htdocs/ 와 /root/dirA 내용 확인

docker exec web2 ls /usr/local/apache2/htdocs/
# ls /root/dirA/ 와 동일

web3 의 /usr/local/apache2/htdocs/ 와 /var/lib/docker/dirB/_data/ 내용 확인

docker exec web3 ls /usr/local/apache2/htdocs/
# ls /var/lib/docker/volume/dirB/_data 와 동일

web1, web2, web3 아이피 주소 확인


# curl IP 주소로 내용 확인

docker inspect web1 | grep IPA
docker inspect web2 | grep IPA
docker inspect web3 | grep IPA

curl web1 ip address
# => 결과 X
curl web2 ip address
# => /root/dirA dir
curl web3 ip address
# => It's work

/root/dirA/index.html => "chagne dirA" 으로 내용 수정

echo "change dirA" > /root/dirA/index.html

/var/lib/docker/dirB/_data/index.html => "change dirB" 으로 내용 수정

echo "change dirB" > /var/lib/docker/volume/dirB/_data/index.html

web2, web3 curl 실행

curl web2 ip address
# => change dirA 
curl web3 ip address
# => change dirB

web4 컨테이너 생성 : 도커볼륨 dirB 와 /usr/local/apache2/htdocs/ 매칭

docker run -d --name web4 -v dirB:/usr/local/apache2/htdocs/ httpd

web4 curl 실행

curl web4 ip address
# => change dirB

도커 볼륨 리스트 확인

docker volume ls

33. 볼륨 문제

httpd 이미지로 web1, web2, web3 컨테이너 생성

(1) web1 : curl ip주소 실행시 => "docker cp test" 메세지 출력 - cp 명령어 이용

docker run -d --name web1 httpd

echo "docker cp test" > index.html

docker container cp index.html web1:/usr/local/apache2/htdocs/

curl web1 ip address

(2) web2 : curl ip주소 실행시 => "docker bind mount test" 메세지 출력 - bind mount 이용

docker run -d --name web2 -v /root/webdir:/usr/local/apache2/htdocs/ httpd 

echo "docker bind mount test" > /root/webdir/index.html

curl web2 ip address

(3) web3 : curl ip주소 실행시 => "docker volume test" 메세지 출력 되도록 - docker volume 이용

docker run -d --name web3 -v webvol:/usr/local/apache2/htdocs/ httpd

echo "docker volume test" > /var/lib/docker/volumes/webvol/_data/index.html

curl web3 ip address

(4) web4 : curl ip주소 실행시 => "docker volume test" 메세지 출력 되도록 - docker volume 이용

docker run -d --name web4 -v webvol:/usr/local/apache2/htdocs/ httpd

curl web4 ip address 

34. 네트워크 확인

모든 컨테이너 삭제

docker rm -f $(docker ps -aq)

도커 네트워크 리스트 확인

docker network ls

도커 bridge docker1 생성 (default)

docker network create [-d brigde] docker1 

docer1의 네트워크 확인

docker inspect docker1

도커 bridge docker2 생성 (network : 192.168.100.0/24, gateway : 192.168.100.254)

docker network create [-d brigde] --subnet "192.168.100.0/24" --gateway "192.168.100.254" docker2

docker2의 네트워크 확인

docker inspect docker2

컨테이너 생성

web1:네트워크 docker0

docker run -d --name web1 httpd

web2:네트워크 docker2

docker run -d --name web2 --network docker2 httpd

web3:네트워크 host dirB 볼륨에 매칭

docker run -d --name web3 --network host -v dirB:/usr/local/apache2/htdocs httpd

IP주소 확인

docker inspect web1 | grep IPA
docker inspect web2 | grep IPA
docker inspect web3 | grep IPA

외부 터미널에서 curl 192.168.56.101 쳐서 내용확인

[root@docker~]#curl 192.168.56.101
[root@docker~]#curl localhost

os1, os2 컨테이너 생성 ubuntu 이미지를 이용해서

os1:네트워크 docker0 web1을 hosts 파일에 등록(명령어를 사용해서)

docker run -itd --name os1 --link web1 ubuntu
docker exec os1 cat /etc/hosts

os2:네트워크 docker2 web2를 hosts 파일에 등록(exec를 이용해서)

docker run -itd --name os2 --network docker2 ubuntu
docker exec os2 cat /etc/hosts
# => web에 대한 주소가 안보임
docker exec -it os2 bash
vi /etc/hosts

192.168.100.2    web2

:wq

os1에서 web1의 index.html 확인

docker exec os1 curl web1
# 혹시 curl 명령어가 없다면
docker exec os1 ping web1 

os2에서 web2의 index.html 확인

docker exec os2 curl web2
# 혹시 curl 명령어가 없다면
docker exec os2 ping web2

web4 컨테이너 생성 web4 : host의 50000 port와 web4의 80 port 매칭

docker run -d --name web4  -p 50000:80 httpd

본 시스템에서 curl 192.168.56.101 결과 확인

# 메인 터미널에서

curl 192.168.56.101:50000

# or

ping 192.168.56.101:50000

35. 도커 이미지 만들기

os1 컨테이너 생성 - centos:7 이미지 사용

docker run -itd --name os1 centos:7

os1 에 httpd 서비스구성

docker exec os1 yum -y install httpd

# or

docker exec -it os1 bash

yum -y install httpd

docker commit 명령어로 httpd 서비스가 동작하는 이미지 생성 port 80도 설정 (hint "CMD ['/usr/sbin/httpd','-D','FOREGROUND']" )

echo "commit test" > index.html

docker container cp index.html os1:/var/www/html

docker commit --change "CMD ['/usr/sbin/httpd','-DFOREGROUND']" --change 'EXPOSE 80' os1 myweb:v1 

생성된 이미지로 myweb:v1 컨테이너 생성

docker run -d --name testweb myweb:v1

docker inspect testweb | grep IPA

curl testweb ip address

docker inspect testweb | grep -A 2 Port
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment