TIL/개념정리

docker 자주 썼던 명령어, 설정들 간단하게 정리

초집중 2023. 3. 13. 22:52

네트워크 관련

 

기본적으로 도커 컨테이너는 격리되어 있다.
컨테이너간 통신을 하기 위해 네트워크를 정의해줘야하는데 compose를 활용해서 묶거나 새로 네트워크를 만들어서 만든 네트워크에 등록해준다.

 

  • Compose
networks:
  server-connection:
    driver: bridge
  db-connection:
    driver: bridge

 

  • 개별 컨테이너
# 네트워크 만들기

docker network create <network name>

# 네트워크에 연결하기

docker run --name <container name> --network <network name> <image name>

# 예시
docker network create server-network

docker run --name mysql-container --network server-network -v mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql
docker run --name server-container --network server-network -p 5000:5000 myserver-image

네트워크 관련 주의할 점

container간 통신을 할때는 host가 container name이 된다

이때 docker-compose에서는 service name이 host가 되서 주의해야한다.

 

아래 컴포즈 파일에서 mysql-container와 연결하고 nginx upstream을 등록해야할 때 호스트로 container명으로 등록해서 계속 연결 못하는 오류가 있었다.

 

mysql-container라는 이름이지만 docker-compose로 연결해서 호스트는 service name인 db가 되고 컴포즈에서 관리하지 않는다면 container name이 호스트가 되었다. 

version: '3.3'

services:
  nginx:
    container_name: nginx
    image: nginx
    restart: always
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
      - server-connection
    environment:
      - TZ=Asia/Seoul
	...
    
  server:
    container_name: clip-planet-server
    build:
      dockerfile: ./Dockerfile
    restart: always
    expose:
      - '5000'
    networks:
      - db-connection
      - server-connection
	...
    
  db:
    image: mysql:8.0.30
    command: mysqld --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    restart: always
    container_name: mysql-container
    networks:
      - db-connection
	...

networks:
  server-connection:
    driver: bridge
  db-connection:
    driver: bridge

 

이미지 빌드 후 실행시 발생했던 에러

exec /usr/local/bin/docker-entrypoint.sh: exec format error

 

 

exec user process caused “exec format error” 에러해결

docker image build시 이런에러가 날 떄가 있습니다.원인 : 운영체제 차이해결방법 : 빌드시 태그 추가

velog.io

 

Multi-platform images

 

docs.docker.com

내가 image를 빌드한 환경은 mac이었는데 GCE를 이용하면서 멀티 플랫폼 이슈가 발생했다.

 

buildx라는 명령어를 통해 멀티 플랫폼 이슈를 해결할 수 있었고 도커 최신 버전이라면 전부 지원되는 것 같다.

docker buildx build --platform linux/amd64 --load --tag <docker hub id/image_name> .

docker push <docker hub id/image_name>

나는 도커 허브에 올리기 위해 tag 옵션을 사용했으며 load 옵션은 이미지를 로컬 캐시로 저장시키는 명령어이다. 이후 캐시를 통해 컨테이너를 실행시키거나 바로 푸시하는데 사용할 수 있다고 한다.

 

tag 옵션을 붙이지 않는다면 이후 새로 태그를 붙여주면 된다.

docker tag <image_name> <docker_hub_ID or private_registry_ip:port>/<push하고자하는 image>

 

볼륨

컨테이너는 중지되거나 재시작되면 데이터가 초기화된다.
따라서 데이터를 물리적으로 저장시킬 필요가 있다면 volume을 만들어야 하고 만드는 명령어는 다음과 같다.

 

docker volume create mysql-data
docker run ... -v mysql-data:/var/lib/mysql ...

 

자잘한 명령어들

# 중지된 컨테이너 모두 삭제하기
docker container prune

# 모든 이미지 보기
docker images

# 실행중인 컨테이너 보기
docker ps

# 이미지 삭제하기
docker rmi image_name or image_id