programing

도커 컨테이너 이미지가 변경된 후 업그레이드하는 방법

easyjava 2023. 9. 26. 22:39
반응형

도커 컨테이너 이미지가 변경된 후 업그레이드하는 방법

내가 공식 mysql:5.6.21 이미지를 당겼다고 가정해 보겠습니다.

도커 컨테이너를 여러 개 만들어서 이 이미지를 배치했습니다.

MySQL 5.6.22가 출시될 때까지 이러한 컨테이너는 한동안 실행되었습니다.mysql:5.6의 공식 이미지는 새 릴리스와 함께 업데이트되지만 내 컨테이너는 여전히 5.6.21을 실행합니다.

이미지의 변경 사항(즉, MySQL 배포판 업그레이드)을 기존의 모든 컨테이너로 전파하려면 어떻게 해야 합니까?이것을 하는 적절한 도커 방법은 무엇입니까?

답안을 평가하고 주제를 공부한 후에 요약하고자 합니다.

컨테이너를 업그레이드하는 Docker 방법은 다음과 같습니다.

응용프로그램 컨테이너는 응용프로그램 데이터를 저장하지 않아야 합니다.이렇게 하면 다음과 같은 작업을 실행하여 언제든지 앱 컨테이너를 최신 버전으로 교체할 수 있습니다.

docker pull mysql
docker stop my-mysql-container
docker rm my-mysql-container
docker run --name=my-mysql-container --restart=always \
  -e MYSQL_ROOT_PASSWORD=mypwd -v /my/data/dir:/var/lib/mysql -d mysql

호스트(볼륨으로 마운트된 디렉토리에) 또는 특수 데이터 전용 컨테이너에 데이터를 저장할 수 있습니다.자세히 보기

(예: yum/apt-get 업그레이드로) 컨테이너 에서 애플리케이션을 업그레이드하는 것은 안티패턴으로 간주됩니다.응용프로그램 컨테이너는 재현 가능한 동작을 보장하는 불변성으로 간주됩니다.일부 공식 애플리케이션 이미지(특히 myql:5.6)는 자체 업데이트하도록 설계되지도 않았습니다(apt-get 업그레이드가 작동하지 않음).

답변을 주신 모든 분들께 감사드립니다. 다양한 접근법을 볼 수 있도록 말이죠.

저는 마운트 볼륨을 호스트 디렉토리에 대한 링크로 사용하는 것을 좋아하지 않기 때문에 도커 관리 컨테이너 전체를 사용하여 도커 컨테이너를 업그레이드하는 패턴을 위한 패턴을 생각해 냈습니다.h를 새--volumes-from <container>는 업데이트된 이미지와 함께 도커 관리 볼륨의 공유 소유권을 새 컨테이너에 제공합니다.

docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql

my_mysql_container그러나 업그레이드된 컨테이너에 올바른 데이터가 없거나 정상성 테스트에 실패한 경우에는 알려진 작업 컨테이너로 다시 돌아갈 수 있습니다.

이 시점에서, 저는 보통 무슨 일이 생길 경우를 대비해 컨테이너에 필요한 모든 백업 스크립트를 실행하여 안전망을 제공할 것입니다.

docker stop my_mysql_container
docker start my_mysql_container_tmp

이제 새 컨테이너에 포함될 것으로 예상되는 데이터가 있는지 확인하고 정상 상태를 확인할 수 있습니다.

docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container

도커 볼륨은 컨테이너가 사용하는 동안 유지되므로 원래 컨테이너를 안전하게 삭제할 수 있습니다.원래의 용기가 제거되면, 새로운 용기는 원래의 이름과 같은 이름을 가정하여 모든 것을 처음처럼 예쁘게 만들 수 있습니다.

도커 컨테이너를 업그레이드할 때 이 패턴을 사용하면 크게 두 가지 이점이 있습니다.첫째, 볼륨을 업그레이드된 컨테이너로 직접 전송할 수 있도록 함으로써 볼륨을 호스트 디렉토리에 마운트할 필요가 없습니다.둘째, 작동 중인 도커 컨테이너가 존재하지 않는 위치에 있는 경우가 없으므로 업그레이드에 실패할 경우 원래 도커 컨테이너를 다시 회전시켜 이전의 작동 상태로 쉽게 되돌릴 수 있습니다.

더 일반적인(mysql 특정한) 답변을 제공하기 위해서...

  1. 요컨대

서비스 이미지 레지스트리(https://docs.docker.com/compose/compose-file/ #image)와 동기화:

docker-compose pull 

도커 합성 파일 또는 이미지가 변경된 경우 컨테이너 재생성:

docker-compose up -d
  1. 배경

컨테이너 이미지 관리는 도커- compose를 사용하는 이유 중 하나입니다(https://docs.docker.com/compose/reference/up/) 참조).

도커-컴포지션은 서비스를 위한 컨테이너가 존재하고, 컨테이너를 생성한 후 서비스의 구성이나 이미지가 변경된 경우, 컨테이너를 중지하고 재생성함으로써(마운트된 볼륨을 보존함) 변경 사항을 픽업합니다.구성이 변경사항을 선택하지 못하도록 하려면 --no-recreate 플래그를 사용합니다.

탑재된 외부 "volumes"(https://docs.docker.com/compose/compose-file/ #volumes 참조) 또는 데이터 컨테이너를 통한 도커 compose도 데이터 관리 측면을 다룹니다.

따라서 하위 호환성 및 데이터 마이그레이션 문제는 그대로 유지되지만, 이러한 문제는 도커 특유의 문제가 아니라 "적용적" 문제이며 릴리스 노트 및 테스트와 비교하여 확인해야 합니다.

이 프로세스를 자동으로 수행하려면(@Yaroslav에서 설명한 것과 동일한 설정의 새 컨테이너를 다운로드, 중지 및 재시작) WatchTower를 사용할 수 있음을 추가하고자 합니다.컨테이너가 변경될 때 자동으로 컨테이너를 업데이트하는 프로그램 https://github.com/v2tec/watchtower

다음과 같은 답변을 고려해 보십시오.

  • 과 같습니다.app_schema
  • 은 }입니다.app_db
  • 는 }입니다.root123

컨테이너 내부에 애플리케이션 데이터를 저장할 때 MySQL을 업데이트하는 방법

컨테이너를 분실하면 데이터가 손실되기 때문에 이는 잘못된 관행으로 간주됩니다.이것은 나쁜 관행이지만, 가능한 방법은 다음과 같습니다.

1) 데이터베이스 덤프를 SQL로 수행:

docker exec app_db sh -c 'exec mysqldump app_schema -uroot -proot123' > database_dump.sql

2) 이미지 업데이트:

docker pull mysql:5.6

3) 컨테이너 업데이트:

docker rm -f app_db
docker run --name app_db --restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=root123 \
-d mysql:5.6

4) 데이터베이스 덤프를 복원합니다.

docker exec app_db sh -c 'exec mysql -uroot -proot123' < database_dump.sql

외부 볼륨을 사용하여 MySQL 컨테이너를 업데이트하는 방법

외부 볼륨을 사용하는 것이 데이터를 더 잘 관리하는 방법이며 MySQL 업데이트를 더 쉽게 해줍니다.컨테이너를 분실해도 데이터가 손실되지 않습니다.도커 컴포지트를 사용하면 단일 호스트에서 다중 컨테이너 도커 응용프로그램을 쉽게 관리할 수 있습니다.

) 을 .docker-compose.yml파일을 통해 응용프로그램을 관리할 수 있습니다.

version: '2'
services:
  app_db:
    image: mysql:5.6
    restart: unless-stopped
    volumes_from: app_db_data
  app_db_data:
    volumes: /my/data/dir:/var/lib/mysql

에서) MySQL (에서)docker-compose.yml일):

docker-compose pull
docker-compose up -d

참고: 위의 마지막 명령은 MySQL 이미지를 업데이트하고 새 이미지로 컨테이너를 다시 만들고 시작합니다.

위와 유사한 답변

docker images | awk '{print $1}' | grep -v 'none' | grep -iv 'repo' | xargs -n1 docker pull

docker-composeg를 할 때Dockerfile.

  1. 사용자 정의 도커 파일을 먼저 작성하고 다음 버전 번호를 추가하여 구별합니다. 예:docker build -t imagename:version .새 버전이 로컬에 저장됩니다.
  2. 실행.docker-compose down
  3. 편집:docker-compose.yml1입니다 한 새 입니다.
  4. 실행.docker-compose up -d 로컬에서 이미지를 찾고 업그레이드된 이미지를 사용합니다.

-편집-

위의 단계들은 필요 이상으로 상세합니다.build: .parameter to my docker일.이제 단계는 다음과 같습니다.

  1. 내 도커 파일이 내가 원하는 모양인지 확인합니다.
  2. 도커 합성 파일에 내 이미지 이름의 버전 번호를 설정합니다.
  3. 되지 않은 : us를 합니다.docker-compose build
  4. 실행.docker-compose up -d

그때는 몰랐는데, 도커 컴포지트는 명령 하나로 컨테이너를 새 이미지로 업데이트할 수 있을 정도로 똑똑합니다.

도커 컴포지션을 사용하고 싶지 않다면 포트라이너를 추천해 드립니다.최신 이미지를 풀링하면서 컨테이너를 재생성할 수 있는 재생성 기능이 있습니다.

모든 이미지를 재구성하고 모든 컨테이너를 다시 시작해야 하거나, 소프트웨어를 업데이트하고 데이터베이스를 다시 시작해야 합니다.업그레이드 경로는 사용자가 직접 설계하는 것 외에는 없습니다.

http://blog.stefanxo.com/2014/08/update-all-docker-images-at-once/ 에서 보기

다음 명령 파이프라인을 사용하여 모든 기존 이미지를 업데이트할 수 있습니다.

docker images | awk '/^REPOSITORY|\<none\>/ {next} {print $1}' | xargs -n 1 docker pull

해당 컨테이너 내부의 프로세스 상태와 관련된 컨테이너에 저장하는 모든 영구 데이터(구성, 로그 또는 응용 프로그램 데이터)에 볼륨을 사용하고 있는지 확인합니다.도커 파일을 업데이트하고 원하는 변경 내용으로 이미지를 재구성한 후 볼륨을 적절한 위치에 마운트한 상태로 컨테이너를 다시 시작합니다.

여기서부터 여러가지 시도를 했지만 결국은 잘 해결됐습니다. 계신 분들은.AutoRemove: On컨테이너에서 컨테이너를 중지하거나 편집할 수 없거나 서비스가 실행 중이며 잠시도 중지할 수 없습니다. 다음 작업을 수행해야 합니다.

풀 --> -->docker pull [image:latest](포트테이너 이미지) 합니다에 됩니다. Portainer Images 섹션에 UNSER 태그가 표시됩니다.

Portainer 또는 CLI를 사용하여 서비스를 업데이트하고 이미지의 최신 버전을 사용하는지 확인하면 Portainer에서 사용할 수 있는 옵션이 제공됩니다.

이렇게 하면 컨테이너가 최신 이미지로 업데이트될 뿐만 아니라 서비스가 계속 실행됩니다.

이것은 제 자신의 이미지를 위해 저 또한 고심해왔던 것입니다.도커 이미지를 만드는 서버 환경이 있습니다.제가 서버를 업데이트할 때, 제 도커 이미지를 기반으로 컨테이너를 실행하고 있는 모든 사용자가 최신 서버로 업그레이드할 수 있기를 바랍니다.

이상적으로, 도커 이미지의 새로운 버전을 생성하고, 해당 이미지의 이전 버전을 기반으로 한 모든 컨테이너를 자동으로 "제자리"에 새 이미지로 업데이트하는 것입니다.하지만 이 메커니즘은 존재하지 않는 것 같습니다.

지금까지 생각해낸 차선책은 컨테이너 자체를 업데이트하는 방법입니다. 데스크톱 애플리케이션이 업데이트를 확인한 후 자체를 업그레이드하는 방법과 유사합니다.제 경우에는 잘 알려진 태그에서 Git을 꺼내는 스크립트를 만드는 것을 의미할 것입니다.

이미지/컨테이너는 실제로 변경되지 않지만 해당 컨테이너의 "내부"는 변경됩니다.여러분은 apt-get, yum, 또는 여러분의 환경에 맞는 어떤 것이든지 같은 것을 하는 것을 상상할 수 있을 것입니다.이와 함께 레지스트리에서 myserver:최신 이미지를 업데이트하여 새로운 컨테이너가 최신 이미지를 기반으로 할 수 있도록 하겠습니다.

이 시나리오를 다룬 선행기술이 있는지 듣고 싶습니다.

갱신하다

이것은 주로 이미지를 구축하는 방법이므로 업데이트하지 않는 컨테이너를 쿼리하기 위한 것입니다.

저도 같은 문제가 있어서 도커 컨테이너 내부에서 실행되는 매우 간단한 명령줄 도구인 도커런을 만들어 실행 중인 다른 컨테이너의 패키지를 업데이트했습니다.

실행 중인 도커 컨테이너와 통신하고 패키지를 업데이트하거나 임의의 단일 명령을 실행하기 위해 도커 파이를 사용합니다.

예:

docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec

기본적으로 실행됩니다.date실행 중인 모든 컨테이너에서 명령어를 실행하고 결과를 반환하지만 모든 명령어를 실행할 수 있습니다.docker-run exec "uname -a"

패키지 업데이트하기(현재 apt-get만 사용):

docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run update

생성 및 별칭을 생성하여 일반 명령줄로 사용할 수 있습니다.

alias docker-run='docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run'

언급URL : https://stackoverflow.com/questions/26734402/how-to-upgrade-docker-container-after-its-image-changed

반응형