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 사용자PWdocker pull image_name docker push image_name docker createdocker run --name -p -v 이미지이름 --name을 통해 이름을 Container 이름을 지정해 줄 수 있음-p를 통해 docker container의 port를 외부에도 연결해 줄 때 사용-v는 docker volume을 설정해 줌docker psdocker ps -adocker ps -qdocker 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_namedocker exec hangman cat /etc/hosdocker run image_namedocker run -d image_namedocker 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/pluginsdocker 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 변경)
(docker 삭제 및 재실행 후)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 psdocker imagesdocker 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 redisdocker run -d --name=db -e POSTGRES_PASSWORD=password --network mynetwork postgresdocker run -d --name=vote -p 5001:80 --network mynetwork votedocker run -d --name=result -p 5002:80 --network mynetwork resultdocker 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문을 사용해야 한다고 했다.