docker 명령어, Dockerfile, docker-compose.yml

LeeKyoungChang·2023년 1월 18일
0
post-thumbnail

docker, jenkins 실행 목록

 

📚 1. Docker

✔ /var/run/docker.sock

docker sock

  • 도커엔진 명령어를 쳤을 때 이와 같은 구조로 돌아간다.

 

✔ docker 위치

/usr/bin/docker

 

✔ 현재 Host에 다운 받은 이미지들을 출력하는 명령어

# docker images

 

✔ 도커 단일 이미지 삭제

# docker image rm <image ID>

=> 만약 해당 이미지를 컨테이너에서 사용하고 있으면 삭제할 수 없다.

 

✔ 실행 중인 docker 확인하기

ps aux | grep docker

docker ps

  • container, image 다루는 명령어는 : /usr/bin/docker 에서 실행된다.
  • docker engine process는 : /usr/bin/dockerd 파일로 실행되고 있다. (docker 명령어가 실제 아닌 docker engine이 아닌 client로서의 docker이다.)
    • CLI : 도커 클라이언트
    • dockerd : 도커데몬

=> 현재 docker 준비가 완료되었다.

 

✔ docker search x
해당 이미지 x의 이름으로 설정된 클라우드 상의 이미지를 확인할 수 있다.

ubuntu

  • ubuntu image가 생성된 것을 확인할 수 있다. (접근할 때는 docker run -i -t --name 이름 ubuntu:20.04)

 

✔ 도커 모든 이미지 삭제

# docker rmi $(docker images -q) -f

(docker image -q) : 이미지의 ID를 출력하는 명령어

 

✔ 도커 컨테이너 생성

# docker run <옵션 --name <컨테이너이름:test><이미지 Repository>
  • i : 사용자가 입출력을 할 수 있는 상태
  • t : 가상 터미널 환경을 에뮬레이션하겠다.
  • d : 컨테이너를 일반 프로세스가 아닌 데몬프로세스(백그라운드) 형태로 실행해 프로세스가 끝나도 유지되도록 한다.

 

✔ 실행 중인 docker 검색

# docker ps
  • 실행 중인 컨테이너 리스트 출력

 

# docker ps -a
  • 실행했던 컨테이너 리스트의 이력을 출력

 

✔ 컨테이너 접속

# docker exec -it <컨테이너 이름> /bin/bash

 

✔ 컨테이너 삭제

# docker rm <컨테이너 이름>
  • 컨테이너 삭제하기 전에 docker 실행 종료해야 한다.

 

✔ docker 실행, 종료

# docker start <컨테이너 이름>
# docker stop <컨테이너 이름>

 

✔ docker images를 모두 삭제하고 싶을 때**

# docker rm $(docker ps -aq)

✔ container를 image화

docker commit \ : container를 image화

 

✔ docker inspect ubuntu:18.04

docker inspect : container 정보를 확인할 수 있다.

layer

 

✔ container 종료시키며 삭제하기

docker stop container
docker rm container

 

 

📖 A. 삭제

docker rmi 사용방법

 

✔ docker image 강제 삭제
아마 컨테이너가 실행되고 있어 강제 삭제가 되지 않는 경우일 것이다.

(1) 이미지를 사용하는 컨테이너를 다 찾아서 종료한 다음에 삭제하자

docker ps --filter를 사용하면 된다!

특정 이미지를 사용하는 컨테이너만 검색(현재는 nginx:alpine을 사용하는 컨테이너 조회)

$ docker ps -a --filter ancestor=nginx:alpine 

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
c0d45e286e56 nginx:alpine "/docker-entrypoint.…" 2 seconds ago Up 1 second 80/tcp bold_leavitt

 

docker rm -f $(docker ps -aq) : 로컬 시스템의 모든 Docker 컨테이너를 삭제

(2) 이를 이용해 특정 이미지를 사용하는 컨테이너들만 한꺼번에 종료해보자

$ docker rm -f $(docker ps -aq --filter ancestor=nginx:alpine) 

9fc9bccac814 .....

이후, docker rmi로 이미지를 삭제한다.

$ docker rmi nginx:alpine 

Untagged: nginx:alpine 
Untagged: nginx@sha256:07ab71a2c8e4ecb19a5a5abcfb3a4f175946c001c8af288b1aa766d67b0d05d2 Deleted: 
sha256:a64a6e03b0551e1cefa94db6cc6677fb1efed3c557d173f79584ff4ec474b5ae Deleted: 
sha256:d950b497e5a0787af1b4a04e0298b693501d756b610b09e5501bc0d1feb02465 Deleted: 
sha256:01270ad0039edf3793b69b5374505aad02fc2e4464f460215a803fa728eaef8c

 

✔ 사용한 명령어 세트

$ docker rm -f $(docker ps -aq --filter ancestor=[IMAGE]) 
$ docker rmi [IMAGE]

 

 

📚 2. Dockerfile

💡 참고
dockerfile은 실제 작업하는 프로젝트에서 작업하는 것이 좋다.

 

✔ Dockerfile 명령어
FROM : 생성할 이미지의 베이스 이미지
COPY : 로컬의 파일을 이미지에 복사
EXPOSE : 노출할 포트 지정
ENTRYPOINT : 컨테이너가 시작될 때 수행할 명령어를 지정

docker build -t login-service:0.0 ./ : login-service:0.0은 image이름

 

💡 참고
docker hub : ec2에서 작업할 때 사용한다.
docker desktop : local에서 작업할 때 사용한다.

 

📖 A. 명령문

✔ FROM

FROM <이미지>
FROM <이미지>:<태그>
  • docker image는 base image부터 시작해서 기존 이미지위에 새로운 이미지를 중첩해서 여러 단계의 이미지 층(layer)을 쌓아가며 만들어진다.

ex)

FROM ubuntu:latest
  • ubuntu 최신버전을 base 이미지로 사용

 

✔ COPY/ADD 명령문

COPY <src>... <dest>
COPY ["<scr>",... "<dest>"]
  • copy 명령문은 호스트 컴퓨터에 있는 디렉터리나 파일을 Docker 이미지의 파일 시스템으로 복사하기 위해서 사용된다. (절대 경로와 상대 경로를 모두 지원)
  • 만약에 상대 경로를 사용할 경우, 이전에 등장하는 WORKDIR 명령문으로 작업 디렉터리를 어디로 전환했는지 고려해야 한다.

 

ex)

COPY package.json package.json
  • package.json 파일만 복사
WORKDIR app/
COPY ..
  • 이미지를 빌드한 디렉텉리의 모든 파일을 컨테이너의 app/ 디렉터리로 복사

 

✔ ARG 명령문

ARG <이름>
ARG <이름>=<기본 값>
  • docker build 커맨드로 이미지를 빌드 시, --build-arg 옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용한다.

ex)

ARG port
$ docker build --build-arg port=8080
  • docker build 커맨드에 --build-arg 옵션에 port 값을 넘길 수 있다.

 

ARG port=8080

CMD start.sh -h 127.0.0.1 -p ${port}
  • 인자의 디폴트 값을 지정해주면, --build-arg 옵션으로 해당 인지가 넘어오지 않았을 때 사용된다.

  • 설정된 인자 값은 ${인자명} 형태로 읽어서 사용할 수 있다.

  • ENV와 달리 ARG로 설정한 값은 이미지가 빌드되는 동안에만 유효하다.

 

✔ EXPOSE

EXPOSE <포트>
EXPOSE <포트>/<프로토콜>
  • 네트워크 상에서 컨테이너로 들어오는 트래픽(traffic)을 리스닝(listening)하는 포트와 프로토콜을 지정하기 위해 사용한다.
  • 프로토콜은 TCP, UDP 중 선택할 수 있는데 지정하지 않을 시, TCP가 기본 값으로 사용된다.
  • 지정된 포트는 해당 컨테이너 내부에서만 유효하다.
  • 호스트 컴퓨터에서 해당 포트로 접근을 허용하려면 docker run 커맨드를 -p 옵션을 통해 호스트 컴퓨터의 특정 포트를 포워딩 시켜줘야 한다.

ex)

EXPOSE 80
EXPOSE 9999/udp
  • 80/TCP 포트로 리스닝
  • 9999/UDP 포트로 리스닝

 

✔ ENTRYPOINT

ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
ENTRYPOINT <전체 커맨드>
  • 이미지를 컨테이너로 띄울 때 항상 실행되어야 하는 커맨드를 지정할 때 사용한다.
  • Docker 이미지를 마치 하나의 실행 파일처럼 사용할 때 유용하다.
  • 컨테이너가 뜰 때 ENTRYPOINT 명령문으로 지정된 커맨드가 실행되고, 이 커맨드로 실행된 프로세스가 죽을 때, 컨테이너도 종료된다.

ex)

ENTRYPOINT ["npm", "start"]
ENTRYPOINT ["java","-jar","/app이름.jar"]
  • npm start 스크립트 실행
  • java, jar, app이름.jar 실행

 

 

✔️ volume

VOLUME [host directory]:[container directory]

  • host directory : host directory 위치에 docker image를 저장한다.
  • container directory : container directory 위치에 docker image를 저장한다.

 

✔ 정리

명령어 용도

 

✔ docker tag

tag

  • login-service:0.0 => livenow14/login-service:0.0에 똑같은 데이터 저장

 

✔ port 지우기

lsof -ti :8080 : 8080 port 지우기

 

✔ container 중지와 삭제를 같이하기

docker rm -f container이름

 

✔ docker background에서 실행

docker run -d -p 8080:8080 --name container이름 image이름

 

ex)

FROM jenkins/jenkins:jdk11
VOLUME /tmp
ADD ./target/batch-visualizer-java-migrator-0.0.1-SNAPSHOT.jar app.jar
ARG JAR_FILE=*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • FROM jenkins/jenkins:jdk11 : jenkins의 jdk 11 베이스 이미지 지정

 

 

📚 3. docker-compose.yml

✔️ docker-compose란?

Docker Compose여러 개의 컨테이너(container)로 구성된 애플리케이션을 관리하기 위한 간단한 오케스트레이션(Orchestration) 도구이다.

 

📖 A. 옵션

✔️ - f 옵션
Docker Compose는 기본적으로 커맨드가 실행하는 디렉토리에 있는 docker-compose.yml 또는 docker-compose.yaml를 설정 파일로 사용한다.

=> 다른 이름이나 경로의 파일을 Docker Compose 설정 파일로 사용하고 싶다면 -f 옵션으로 명시를 해준다.

$ docker-compose -f docker-compose-local.yml up

-f 옵션은 여러 개의 설정 파일을 사용할 때도 사용할 수 있다. 이 때는 나중에 나오는 설정이 앞에 나오는 설정보다 우선하게 된다.

$ docker-compose -f docker-compose.yml -f docker-compose-test.yml up

 

✔️ up

docker-compose up 커맨드는 아마도 Docker Compose에서 가장 자주 사용되는 커맨드!!!!
Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 생성하고 실행하기 위해서 사용한다.

-d 옵션을 사용하여 백그라운드에서 컨테이너를 띄우는 경우가 많다.

$ docker-compose up -d
Creating network "django-app_default" with the default driver
Creating django-app_db_1 ... done
Creating django-app_web_1 ... done

-d 옵션을 사용하지 않으면 현재 터미널이 컨테이너의 로그가 출력되고 Ctrl + C를 눌러서 탈출하는 순간 컨테이너가 모두 정지된다!

 

✔️ down

docker-compose down 커맨드는 docker-compose up 커맨드와 정반대의 동작을 한다.
Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 정지시키고 삭제한다.

$ docker-compose down
Stopping django-app_web_1 ... done
Stopping django-app_db_1  ... done
Removing django-app_web_1 ... done
Removing django-app_db_1  ... done
Removing network django-app_default

 

✔️ 실행 테스트

docker-compose.yml

스크린샷 2023-01-22 오후 5 49 46

 

docker-compose up으로 실행했을 경우
스크린샷 2023-01-22 오후 5 32 03

 

docker-compose up -d로 실행했을 경우

스크린샷 2023-01-22 오후 5 49 38 스크린샷 2023-01-22 오후 5 54 13

 

 

📚 4. nginx와 docker-compose

📖 A. nginx

✔ docker에서만 nginx 실행되게 하기

sudo apt-get purge nginx nginx-common : nginx 지우기

nginx

  • nginx도 이미지로 만들기 위해 Dockerfile을 작성해야 한다.

DockerFile

FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf

 

nginx config 파일을 container에 넣어줘야 한다.

vim nginx.conf

events {}

http {
	upstream app {
		server 172.17.0.1:8080;
	}

	server {
		listen 80;

		location / {
			proxy_pass http://app;
		}
	}
}
  • 172.17.0.1 : ec2 ip 주소(docker engine 자체의 network)

 

docker build -t login-service:nginx ./ : ./ dockerfile위치

docker run -d -p 80:80 --name login-service-nginx login-service:nginx : nginx image 실행으로 container 생성

docker tag login-service:nginx livenow14/login-service:nginx : login-service:nginx의 이미지를 livenow14/login-service:nginx 태그로 올리기 위해 사용

docker image

 

✔ docker container 한번에 삭제하기, docker image 삭제

docker rm -f a8(container) b8(container)

docker rmi 9b(image)

 

✔ docker-compose.yml을 사용하면?

  • 컨테이너 실행 명령어 공유
  • 컨테이너 관리 부족을 해결할 수 있다.

 

📖 B. docker-compose

✔ docker-compose

경로 : compose

dockercompose

  • docker hub의 web의 image
  • docker hub의 nginx의 image

 

docker-compose up -d : background에서 image 실행

 

 

현재 컨테이너 생성시 포트 번호 제약이 있다.

도커 스웜 모드를 이용하면 해결된다.

docker 시각적으로 노드들을 확인할 수 있다.

docker service create \
	--name=viz \
	--publish=8000:8080/tcp \
	--constraint=node.role==manager \
	--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
	dockersamples/visualizer

 

 


참고

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글