[Docker] 1. 기본 명령어

Jk Lim·2023년 7월 3일
0

MLOps 부트캠프

목록 보기
31/34
post-thumbnail

오늘은 도커의 기본 명령어 중에서

  1. create
  2. ps
  3. start
  4. run
  5. update
  6. attach
  7. exec
  8. top
  9. logs
  10. cp
  11. diff 에 대해 학습하였다.

1. create

  • 이미지로부터 도커 컨테이너 생성하는 명령어
docker create -it --name os1 centos:latest
docker inspect httpd
...
...
"AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "sha256:f5b050f177fd426be8fe998a8ecf3fb1858d7e26dff4080b29a327d1bd5ba422",
  • 운영체제 이미지의 경우 cmd가 쉘 프로그램으로 되어있다
  • -it : 운영체제 이미지일 경우, 표준 입출력 및 터미널을 지정하는 옵션
  • --name : 컨테이너 이름 지정. 입력 안하면 도커에서 마음대로 생성

2. ps

  • 현재 실행중인 도커 컨테이너
  • -a : 전체 생성된 컨테이너
docker ps -a
CONTAINER ID   IMAGE           COMMAND              CREATED          STATUS                   PORTS     NAMES
632dc7e05bc3   centos:latest   "/bin/bash"          15 minutes ago   Created                            os1
1e1c57ce01c6   httpd:latest    "httpd-foreground"   21 minutes ago   Created                            web1
52a57138f5c2   hello-world     "/hello"             3 hours ago      Exited (0) 3 hours ago             wonderful_swirles

3. start

  • 생성한 도커를 시작하는 명령어
docker start web1
docker inspect web1 # 실행중인 컨테이너 이름으로 조회
...
...
"LinkLocalIPv6PrefixLen": 0,
            "Ports": {
                "80/tcp": null
            },
            "SandboxKey": "/var/run/docker/netns/04b18731c711",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "8f72ee56903e2425188e046aa4bdcfa1adc8fee3dc07e210ef7451580cb1bdac",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",

# 포트, ip주소 확인 가능

curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>
docker start -ai os1
# OS 컨테이너 시작하기 -ai 옵션 필요
# 시작하면 컨테이너 쉘 접속 됨
# exit로 빠져나오면 컨테이너가 종료됨
# ctrl+p+q로 빠져나와야 컨테이너 유지

4. run

  • 컨테이너를 생성하고 바로 실행할 수 있는 명령어 (create + start)
  • 이미지가 없을 시, 허브에서 다운로드까지 진행 (pull)
  • -d : 백그라운드 모드 실행
  • -it : 쉘 컨테이너 실행시 (입력 안하면 컨테이너 바로 종료됨)
  • 컨테이너 실행 시 실행할 명령어 지정 가능. 입력 안하면 “Cmd”에 지정된 명령어 사용. -it옵션 사용 안하면 일회성으로 실행하고 컨테이너 종료됨.
docker run --name os3 centos:latest hostname
fff3f921c001
  • -e : 환경변수 설정하는 옵션
docker run -it --name os3 -e "LAB=docker" centos:latest
echo $LAB # 컨테이너 환경
docker
docker inspect os3
...
...
"OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "LAB=docker",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos:latest",
            "Volumes": null,
  • inspect의 “Env”에 설정한 환경변수 값이 들어간다.
  • -e “변수1 설정” -e “변수2 설정” 처럼 한번에 여러개 환경변수 설정이 가능하다.

5. update

  • 컴퓨팅 자원 한도 수정 명령어
  • run 명령어의 옵션값으로 컴퓨팅 자원 한도를 설정할 수 있고, update로 수정할 수 있다.
  • --cpus : CPU 자원 한도 설정
docker run -it --name os3 --cpus 0.3 centos:latest
dd if=/dev/zero of=/dev/null & #컨테이너 환경에서 강제로 부하 발생시킴
  • --memory : 메모리 자원 한도 설정
docker update --memory 700m os3 # 메모리 한도 업데이트
docker update --cpus 0.4 os3 # cpu 한도 업데이트
docker stats --no-stream # 할당된 컴퓨팅 리소스 확인

6. attach

  • 실행중인 컨테이너의 쉘에 접근하는 명령어
  • Cmd 값이 쉘로 설정 된 컨테이너에만 사용
docker attach os2

7. exec

  • 컨테이너로 접근하지 않고 한번의 명령어를 수행할 때 사용
  • 쉘이 아닌 컨테이너에서 주로 사용
docker exec os2 hostname
docker exec -it web2 bash # -it 옵션을 통해 웹 컨테이너에서 쉘을 실행 할 수도 있다.

8. top

  • 실행중인 컨테이너의 프로세스 정보를 확인하는 명령어
  • 호스트 운영체제의 프로세스 값을 따름
# docker top에서 조회하는 PID값은 호스트 PID값과 같다.
docker top os2
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                11980               11959               0                   10:40               pts/0               00:00:00            /bin/bash
ps -ef | grep 11980
root     11980 11959  0 10:40 pts/0    00:00:00 /bin/bash
root     12445  2266  0 10:54 pts/0    00:00:00 grep --color=auto 11980

# 컨테이너 안에서의 PID 값은 다름
# 네임스페이스가 다르기 때문
docker attach os2
ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 01:40 pts/0    00:00:00 /bin/bash
root        33     1  0 01:55 pts/0    00:00:00 ps -ef

9. logs

  • 컨테이너에 관한 로그를 확인하는 명령어
docker run -d --name db1 mysql:5.7

docker ps -a
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS                      PORTS     NAMES
569e57fe90d9   mysql:5.7       "docker-entrypoint.s…"   16 seconds ago   Exited (1) 15 seconds ago             db1
df4133201ceb   centos:latest   "/bin/bash"               20 hours ago     Up 18 minutes                         os2
97f283e30b33   httpd:latest    "httpd-foreground"        20 hours ago     Up 15 minutes               80/tcp    web2
52a57138f5c2   hello-world     "/hello"                  23 hours ago     Exited (0) 23 hours ago               wonderful_swirles

# status에서 Exited 값이 0이면 정상 종료, 1이면 이상 종료
# db1 컨테이너에 에러가 있어서 실행이 안됨
# 해당 컨테이너의 로그 확인

docker logs db1
2023-06-27 01:58:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.42-1.el7 started.
2023-06-27 01:58:00+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2023-06-27 01:58:00+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.42-1.el7 started.
2023-06-27 01:58:00+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following as an environment variable:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

# 에러에 대한 수정사항 반영해서 run 실행
docker run -d --name db2 -e "MYSQL_ROOT_PASSWORD=1234" mysql:5.7

10. cp

  • 호스트와 컨테이너 간에 파일을 복사하는 명령어
# 파일 가져오기
docker cp web2:/usr/local/apache2/htdocs/index.html /tmp/index.html
Successfully copied 2.05kB to /tmp/index.html
cat /tmp/index.html 
<html><body><h1>It works!</h1></body></html>

# 파일 집어넣기
docker cp ./index2.html web2:/usr/local/apache2/htdocs/index2.html
Successfully copied 2.05kB to web2:/usr/local/apache2/htdocs/index2.html

11. diff

  • 컨테이너의 파일 변동 이력을 확인하는 명령어
  • C 변동된 디렉토리 / A 추가된 파일 / D 삭제된 파일
docker diff os2
C /tmp
A /tmp/services
docker diff web2
C /usr
C /usr/local
C /usr/local/apache2
C /usr/local/apache2/logs
A /usr/local/apache2/logs/httpd.pid
C /usr/local/apache2/htdocs
A /usr/local/apache2/htdocs/index2.html
C /root
A /root/.bash_history

0개의 댓글