✔ /var/run/docker.sock
✔ docker 위치
/usr/bin/docker
✔ 현재 Host에 다운 받은 이미지들을 출력하는 명령어
# docker images
✔ 도커 단일 이미지 삭제
# docker image rm <image ID>
=> 만약 해당 이미지를 컨테이너에서 사용하고 있으면 삭제할 수 없다.
✔ 실행 중인 docker 확인하기
ps aux | grep docker
container
, image
다루는 명령어는 : /usr/bin/docker
에서 실행된다./usr/bin/dockerd
파일로 실행되고 있다. (docker 명령어가 실제 아닌 docker engine이 아닌 client로서의 docker이다.)=> 현재 docker 준비가 완료되었다.
✔ docker search x
해당 이미지 x의 이름으로 설정된 클라우드 상의 이미지를 확인할 수 있다.
docker run -i -t --name 이름 ubuntu:20.04
)
✔ 도커 모든 이미지 삭제
# docker rmi $(docker images -q) -f
(docker image -q) : 이미지의 ID를 출력하는 명령어
✔ 도커 컨테이너 생성
# docker run <옵션 --name <컨테이너이름:test><이미지 Repository>
✔ 실행 중인 docker 검색
# docker ps
# docker ps -a
✔ 컨테이너 접속
# docker exec -it <컨테이너 이름> /bin/bash
✔ 컨테이너 삭제
# docker rm <컨테이너 이름>
✔ 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 정보를 확인할 수 있다.
✔ container 종료시키며 삭제하기
docker stop container
docker rm container
✔ 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]
💡 참고
dockerfile은 실제 작업하는 프로젝트에서 작업하는 것이 좋다.
✔ Dockerfile 명령어
FROM
: 생성할 이미지의 베이스 이미지
COPY
: 로컬의 파일을 이미지에 복사
EXPOSE
: 노출할 포트 지정
ENTRYPOINT
: 컨테이너가 시작될 때 수행할 명령어를 지정
docker build -t login-service:0.0 ./
: login-service:0.0은 image이름
💡 참고
docker hub
: ec2에서 작업할 때 사용한다.
docker desktop
: local에서 작업할 때 사용한다.
✔ FROM
FROM <이미지>
FROM <이미지>:<태그>
ex)
FROM ubuntu:latest
✔ COPY/ADD 명령문
COPY <src>... <dest>
COPY ["<scr>",... "<dest>"]
ex)
COPY package.json package.json
WORKDIR app/
COPY ..
app/
디렉터리로 복사
✔ ARG 명령문
ARG <이름>
ARG <이름>=<기본 값>
--build-arg
옵션을 통해 넘길 수 있는 인자를 정의하기 위해 사용한다.ex)
ARG port
$ docker build --build-arg port=8080
ARG port=8080
CMD start.sh -h 127.0.0.1 -p ${port}
인자의 디폴트 값을 지정해주면, --build-arg
옵션으로 해당 인지가 넘어오지 않았을 때 사용된다.
설정된 인자 값은 ${인자명}
형태로 읽어서 사용할 수 있다.
ENV와 달리 ARG로 설정한 값은 이미지가 빌드되는 동안에만 유효하다.
✔ EXPOSE
EXPOSE <포트>
EXPOSE <포트>/<프로토콜>
docker run 커맨드를 -p 옵션
을 통해 호스트 컴퓨터의 특정 포트를 포워딩 시켜줘야 한다.ex)
EXPOSE 80
EXPOSE 9999/udp
✔ ENTRYPOINT
ENTRYPOINT ["<커맨드>", "<파라미터1>", "<파라미터2>"]
ENTRYPOINT <전체 커맨드>
ENTRYPOINT
명령문으로 지정된 커맨드가 실행되고, 이 커맨드로 실행된 프로세스가 죽을 때, 컨테이너도 종료된다.ex)
ENTRYPOINT ["npm", "start"]
ENTRYPOINT ["java","-jar","/app이름.jar"]
✔️ volume
VOLUME [host directory]:[container directory]
host directory
: host directory 위치에 docker image를 저장한다.container directory
: container directory 위치에 docker image를 저장한다.
✔ 정리
✔ docker 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 베이스 이미지 지정
✔️ docker-compose란?
Docker Compose
는 여러 개의 컨테이너(container)로 구성된 애플리케이션을 관리하기 위한 간단한 오케스트레이션(Orchestration) 도구이다.
✔️ - 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
docker-compose up
으로 실행했을 경우
docker-compose up -d
로 실행했을 경우
✔ docker에서만 nginx 실행되게 하기
sudo apt-get purge nginx nginx-common
: nginx 지우기
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 container 한번에 삭제하기, docker image 삭제
docker rm -f a8(container) b8(container)
docker rmi 9b(image)
✔ docker-compose.yml을 사용하면?
✔ docker-compose
경로 : compose
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
참고