docker build -t image_name
-t
를 통해 이미지의 이름을 줄 수 있음 (tag)--platform=linux/amd64
를 추가하여 다양한 OS에서 사용 가능한 환경을 만듦 docker images
docker image ls
docker rmi
docker image rm
docker login -u 사용자ID -p 사용자PW
docker pull image_name
docker push image_name
docker create
docker run --name -p -v 이미지이름
--name
을 통해 이름을 Container 이름을 지정해 줄 수 있음-p
를 통해 docker container의 port를 외부에도 연결해 줄 때 사용-v
는 docker volume을 설정해 줌docker ps
docker ps -a
docker ps -q
docker stop 컨테이너이름 (혹은 컨테이너ID)
docker start 컨테이너이름 (혹은 컨테이너ID)
docker restart 컨테이너이름 (혹은 컨테이너ID)
docker kill 컨테이너이름 (혹은 컨테이너ID)
docker pause 컨테이너이름 (혹은 컨테이너ID)
docker unpause 컨테이너이름 (혹은 컨테이너ID)
docker rm 컨테이너이름 (혹은 컨테이너ID)
docker logs -f 컨테이너 이름(혹은 컨테이너ID)
-f
가 있으면 해당 컨테이너 안에서 실행되고 있는 로그를 보여 줌docker logs --tail 100 컨테이너이름 (혹은 컨테이너ID)
--tail 100
을 통해 최근 100 개의 로그를 보여 줌docker run --name=hangman image_name
docker exec hangman cat /etc/hos
docker run image_name
docker run -d image_name
docker attach a043(container_id)
Airflow
에서 많이 사용하는 기능 중 하나이다.Volume
의 속성에 따라 읽기 전용이면 이는 불가능하다.✍ 마운트란?
- 원래 마운트는 물리적인 장치를 파일 시스템의 특정 위치(폴더)에 연결해 주는 것이다.
docker run -v
시 페어로 지정docker run -v 컨테이너PATH
-v
뒤의 Container가 중요한 것이기 때문에 persistence (지속성) 있게 만들라고 지정docker run -v name:실행할이름(ContainerID)
📌 Volume을 Readonly로 지정하고 싶다면?
- name:/var/lib/mysql/data:ro
Dockerfile
: -v
옵션을 써서 연동하며 anonymous volume
만 지정 가능docker-compose
: Host Volume
나 Named Volume
를 사용하는 게 일반적 volumes:
${AIRFLOW_PROJ_DIR:-.}/dags:/opt/airflow/dags
${AIRFLOW_PROJ_DIR:-.}/logs:/opt/airflow/logs
${AIRFLOW_PROJ_DIR:-.}/plugins:/opt/airflow/plugins
docker volume ls
docker volume rm
docker volume prune
docker volume inspect
nginx
docker run -d --name=nginx -p 8081:80 nginx
docker exec -it --user=root nginx sh
apt update
를 통해 필요한 패키지를 모두 다운로드 받는다.apt install nano
를 설치해 주면 nano를 통해 파일 편집 역시 가능하다.nano File_Path
이때 만약 내가 수정을 하고 저장을 해 주었다고 할지라도 docker stop nginx(도커 중지)
, docker rm nginx(도커 삭제)
후 docker run -d --name=nginx -p 8081:80 nginx(도커 실행)
docker exec -it --user=root nginx sh(도커 실행)
해 주게 되면 변경 사항이 사라지고 초기 상태가 되게 된다.
docker-compose
docker-compose.yml
파일 volume 설정은 이 위치에서 설정해 주어야 한다. 이때 AIRFLOW_PROJ_DIR
의 환경 변수는 상단에서 설정해 줄 수 있다.
AIRFLOW_PROJ_DIR
는 따로 지정해 주지 않는 이상 default는 .
으로 상위 폴더이다.
docker container ls
를 하고 Container ID
를 개별적으로 삭제할 수 있다. docker container rm Container_ID
$docker container rm -f $(docker container ls -aq)
docker image ls
를 하고 IMAGE ID를 통해 docker image rm image_id
를 삭제해 주어야 한다.docker image rm -f $(docker image ls -q)
docker ps
docker images
docker run
에 link
옵션을 넣었으나 지금은 그렇게 사용하지 않는다.다음과 같이 각각의 Image들이 담긴 Container를 생성해 주었다. 하지만 모두 따로 생성된 상태라 그 사이에 네트워크가 존재하지 않는다.
그래서 5001 포트인 VOTE
에 접속했을 때는 이렇게 투표 화면이 나오게 되지만 투표를 하기 위해 CATS
나 DOGS
를 누르게 되면
바로 오류가 발생하게 된다. 네트워크 커넥션을 설정하지 않았기 때문에 vote
와 redis
가 연결되지 않았고, db
와도 연결되지 않았다.
docker exec -it --user root vote sh
를 통해 vote에 접속해서 ping redis
를 입력한다. 만약 ping
이 설치가 되지 않았다면 apt update
해 준 후 ping 모듈이 들어 있는 iputils-ping
모듈을 설치해 준다. apt install iputils-ping
ping
이란 네트워크 연결 여부를 확인해 준다.
ping redis
를 해 주게 되면 ping: redis: Temporary failure in name resolution
이렇게 뜨는데 이건 현재 vote
가 redis
의 존재를 찾지 못하는 것이다.
이전 다섯 개의 Container를 모두 삭제 후 docker network create mynetwork
먼저 네트워크를 생성해 준다.
그리고 이전의 다섯 개의 Container를 재생성 시 --network
를 통해 mynetwork
내부에서 네트워킹이 가능하도록 해 준다.
Docker Container Network와 연결해 실행
docker run -d --name=redis --network mynetwork redis
docker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgres
docker run -d --name=vote -p 5001:80 --network mynetwork vote
docker run -d --name=result -p 5002:80 --network mynetwork result
docker run -d --name=worker --network mynetwork worker
이렇게 네트워크 내에 Container를 생성한 경우 다시 vote
의 Container로 접속하여 ping redis
를 해 보면 vote
가 redis
를 찾는 것을 확인할 수 있다.
웹에 들어가면 투표가 되는 것도 볼 수 있다.
📌 window 환경에서 -aq 사용 시 오류
- 전체 컨테이너를 삭제해야 하는 명령어로
docker container rm -f $(docker container ls -aq)
해당 명령어를 사용했는데 window 환경에서는 다음과 같은 오류가 발생했다.unknown shorthand flag: 'a' in -aq) See 'docker container rm --help'.
- 확인해 보니 이 명령어는
Linux 계열 shell script
구문이라 발생하는 현상이고, window 환경에서는for
문을 사용해야 한다고 했다.