Оригинальный автор, публичный аккаунт [программист чтение], прошу обратить внимание на паблик аккаунт, просьба указывать источник перепечатываемой статьи.
镜像(Image),容器(Container),仓库(Repository)это то, что мы часто говоримDockerТри основных компонента, собственно, мы описали в предыдущей статье«10 минут, чтобы быстро освоить базовые знания Docker»Я уже вкратце понял знание трех компонентов, но не объяснил их подробно, поэтому в этой статье давайте подробно рассмотрим их вместе.
Изображение
чтоDockerзеркало?
просто понять,Docker镜像только одинLinuxфайловая система (Root FileSystem), эта файловая система содержит файлы, которые можно запускать наLinux内核программу и соответствующие данные.
Говоря об этом, нам, возможно, придется добавить, чтоLinuxЗнание операционной системы:
Вообще говоря,
LinuxДелится на две части:Linux内核(Linux Kernel)и用户空间, в то время как реальныйLinux操作系统,Относится кLinux内核, наш обычно используемыйUbuntu,CentosДругие операционные системы на самом деле являются разными производителями вLinux内核Добавьте собственное программное обеспечение и наборы инструментов на основе (tools) для формирования релизной версии (Linux Distribution).
Следовательно, мы также можем рассматривать зеркало как упомянутое выше用户空间,когдаDockerКогда контейнер создается из образа, образ определяется用户空间Запускается на хосте как отдельный изолированный процессLinux内核выше.
Здесь выделяются две характеристики зеркального отображения:
-
Зеркальное отображение многоуровневое (
Layer): то есть изображение может состоять из нескольких промежуточных слоев, и несколько изображений могут иметь один и тот же промежуточный слой.Мы также можем создать новое изображение, добавив к изображению еще один слой. -
Изображения доступны только для чтения (
read-only): После того, как образ построен, его больше нельзя изменить, и, как мы сказали выше, добавление слоя для построения нового образа фактически создает временный контейнер и добавляет или удаляет файлы в контейнере для формирования нового образа. , потому что контейнер может меняться динамически.
С диаграммой ниже я могу понять лучшеDocker镜像иLinuxОтношение:
Команды управления зеркалами
DockerКоманды, относящиеся к операциям зеркалирования вdocker imageПод этой подкомандой передайтеdocker image --helpЭта команда, вы можете видетьdocker imageПодробная документация подкоманд выглядит следующим образом:
Usage: docker image COMMAND
Manage images
Commands:
build Build an image from a Dockerfile(构建镜像的命令)
history Show the history of an image(显示镜像构建历史过程)
import Import the contents from a tarball to create a filesystem image(导入一个由容器导出的镜像)
inspect Display detailed information on one or more images(显示一个镜像的详细信息)
load Load an image from a tar archive or STDIN(从一个文件或标准输入流中导入镜像)
ls List images(查看镜像列表)
prune Remove unused images(删除虚悬镜像)
pull Pull an image or a repository from a registry(从仓库拉取镜像)
push Push an image or a repository to a registry(推送镜像到仓库)
rm Remove one or more images(删除镜像)
save Save one or more images to a tar archive (streamed to STDOUT by default)(保存镜像到文件)
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE(给镜像打标签)
получить зеркало
установленDockerПосле этого зеркал локально у нас нет.Конечно, можно построить свое, но удобнее начинать сDockerОфициальная складская службаDocker HubПодтяните официальный или сторонний образ, который был создан.
Вытягивающее изображение может быть использованоdocker image pull, который имеет следующий формат:
docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
Конечно,docker image pullЕсть более краткие употребления: например:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Чтобы вытащить изображение, вам нужно указатьDocker RegistryURL и номер порта, по умолчаниюDocker Hub, а также необходимо указать仓库名а метка, имя репозитория и метка однозначно определяют образ, а метка может быть опущена, если опущена, то будет использоваться по умолчаниюlatestКак и имя метки, имя репозитория состоит из имени автора и имени программного обеспечения.
Итак, после исключения этого параметра, например, мы хотим получитьcentosЗеркало, вы можете использовать следующую простую команду изDocker HubПодтяните до:
$ docker pull centos
Посмотреть локальное зеркало
Вышеописанным способом мы подтянули зеркало к локальному, так как же нам проверить, какие зеркала локально доступны? Мы можем просмотреть все локальные зеркала с помощью следующей команды:
$ docker image ls
КонечноDockerПредлагается более лаконичный способ написания:
$ docker images
подвесное зеркало
мы знаемDockerимя зеркала仓库名и标签состав, но иногда мы видим, что имя репозитория и метка оба<none>, мы называем это зеркало как虚悬镜像,Как показано ниже:
虚悬镜像Обычно, когда мы используемdocker pullКогда последнее изображение извлекается, создается новое изображение, поэтому仓库名и标签Новое зеркало дается, а старый зеркальный репозиторий и метка отменяются и становятся虚悬镜像.
Мы можем распечатать все虚悬镜像:
$ docker image ls -f dangling=true
Общее висячее изображение не имеет никакого эффекта, поэтому его можно очистить.Следующая команда может очистить все висячие изображения:
$ docker image prune
Однако, если мы хотим сохранить некоторые полезные виртуальные образы, мы можем использоватьdocker tagКоманда переименовывает и помечает образ для репозитория:
$ docker tag 621d57f27e93 "test:1.0"
Экспорт и импорт изображений
Если вы хотите поделиться изображением с другими, кроме репозитория службы изображенийpullзеркальность и зеркальностьpushФактически, помимо перехода на склад, мы можем напрямую экспортировать и сохранять локально созданный образ в виде файла и отправлять его другим следующим образом:
$ docker image save -o /tmp/test_image.tar.gz centos:latest
И когда вы получаете файл изображения, экспортированный другими, вы можете использоватьdocker loadкоманда для загрузки изображения в локальныйDockerСписок зеркал выглядит следующим образом:
$ docker load < /tmp/test_image.tar.gz
удалить локальное зеркало
Чтобы удалить одно или несколько локальных зеркал, используйте следующую команду:
docker image rm [option] IMAGE1,IMAGE2,...IMAGEn
Вы также можете использовать более лаконичный способ, например:
docker rmi [option] IMAGE1,IMAGE2,...IMAGEn
Изображение можно удалить, используя длинный идентификатор изображения, короткий идентификатор изображения, сводку изображения и имя изображения, как показано ниже.
$ docker rmi f7302e4ab3a8
Как правило, чаще используется короткий идентификатор зеркала, например:
$ docker rmi f7302
Зеркала также можно удалить с помощью сводки зеркала, которую можно запросить с помощью следующей команды:
$ docker image ls --digests
Конечно, когда мы хотим очистить все локальные образы, мы можем использовать следующую команду, но обычно это не рекомендуется.
$ docker rmi $(docker images -qa)
Кроме того, как правило, если изображение использовалось для создания контейнера, использование приведенной выше команды для его удаления сообщит о следующей ошибке, говорящей нам, что изображение было использовано и его нельзя удалить.
Error response from daemon: conflict: unable to remove repository reference "mysql:5.7" (must force) - container ccd406c07a78 is using its referenced image e1e1680ac726
Существует два способа удалить образ, который использовался для создания контейнера: сначала удалить контейнер, а затем удалить образ.-fпараметры, такие как:
$ docker rim -f f7302
Создайте образ с коммитом докера
Во всех приведенных выше примерах используются официальные образы напрямую.На самом деле, помимо извлечения образов, созданных другими из официальных репозиториев или других репозиториев образов, мы также можем создавать собственные образы.Как правило, существуют следующие два метода построения.
использоватьdocker commitкоманду, мы можем повторно отправить измененный контейнер как изображение, например:
$ docker commit conntaner_id my-hello:1.0
Образы, построенные таким образом, мы называемзеркальное отображение черного ящика, точно так же, как черный ящик, другие не знают, какие модификации и операции мы сделали с контейнером, поэтому они будут сомневаться в его безопасности.
Поэтому строить образы таким способом не рекомендуется.Введем более общий и удобный способ.
использоватьDockerfileпостроить образ
Обычно рекомендуется писатьDockerfileсоздать имидж,Docker HubЗеркала выше построены таким образом.Преимущество использования этого метода в том, что нам не нужно раздавать зеркало другим, а толькоDockerfileИ соответствующие данные, которые нужно записать в зеркало, отправляются другим, и другие могут сами построить зеркало, что безопасно и прозрачно.
Напишите простую Got-программу
package main
import "fmt"
func main(){
fmt.Println("Hello Go")
}
будетGoПрограммы компилируются в исполняемые программы, такие как:
$ go build hello.go
написатьDockerfileдокумент
Ниже пишем простойDockerfileфайл, создайте свой первый образ следующим образом:
# 从一个空白的镜像开始
FROM stratch
ADD hello /
# 执行
CMD /hello
Начать создание образа
хорошо написанDockerfileфайл, вам нужно использоватьdocker buildкоманда построить,docker buildФормат команды следующий:
$ docker build [OPTIONS] PATH | URL | -
# 注意最后的点(.)表示当前目录,即Dockerfile所在的目录
$ docker build -t "hello-go:1.0" .
Вышеприведенное является простой демонстрацией использованияDockerfileфайл как создавать образы, оDockerfile, есть еще много более подробного использования, мы поговорим об этом позже.
Контейнер
Отношения между контейнерами и изображениями подобны отношениям между объектами и классами в ориентированном программировании.
Поскольку контейнеры создаются с помощью образов, перед созданием контейнера должен быть доступен образ, а результирующий контейнер представляет собой изолированный процесс, независимый от хоста, и имеет собственную сеть и пространство имен.
Как мы упоминали ранее, образ состоит из нескольких промежуточных слоев. Сгенерированный образ доступен только для чтения, но контейнер доступен для чтения и записи. Это связано с тем, что контейнер добавляет слой чтения-записи (записи) поверх образа. слой чтения), как показано на следующем рисунке:
Команды, связанные с эксплуатацией контейнеров
Usage: docker container COMMAND
Manage containers
Commands:
attach Attach local standard input, output, and error streams to a runnin g container
commit Create a new image from a container's changes(把容器保存为镜像)
cp Copy files/folders between a container and the local filesystem
create Create a new container(创建一个新的容器)
diff Inspect changes to files or directories on a container's filesyste m
exec Run a command in a running container(在一个运行的容器中执行命令)
export Export a container's filesystem as a tar archive
inspect Display detailed information on one or more containers
kill Kill one or more running containers(杀死一个或多个正在运行的容器)
logs Fetch the logs of a container
ls List containers(显示本地容器列表)
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
prune Remove all stopped containers
rename Rename a container(重命名容器)
restart Restart one or more containers(重启一个或多个容器)
rm Remove one or more containers(删除一个或多个容器)
run Run a command in a new container(运行一个新的容器)
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers(停止一个或多个容器)
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
wait Block until one or more containers stop, then print their exit codes
запустить контейнер
Существует несколько различных способов запуска контейнера, наиболее распространенным является использованиеdocker runКоманда может создать контейнер из образа, например:
# /bin/bash表示运行容器后要执行的命令
$ docker run -it centos /bin/bash
docker runКоманда имеет некоторые общие параметры.Например, если контейнер представляет собой процесс-демон, который предоставляет услуги, ему обычно необходимо открыть порты для внешнего доступа, такие как:
$ docker run -p 80:80 nginx
Вы также можете указать имя для контейнера, например:
$ docker run -p 80:80 --name webserver nginx
Другой - использоватьdocker startКоманда перезапускает остановившийся контейнер, например:
# container_id表示容器的id
$ docker start container_id
А для запущенных контейнеров тоже можно передатьdocker restartперезапустите команду, например:
# container_id表示容器的id
$ docker restart container_id
Просмотр списка локальных контейнеров
После запуска контейнера мы можем просмотреть все локальные контейнеры с помощью следующей команды:
$ docker container ls
ноdocker container lsТакже написано лаконично:
$ docker ps
Результат выполнения вышеуказанной команды выглядит следующим образом:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4f184f5ffb9 redis:latest "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 0.0.0.0:6379->6379/tcp myredis
f7d970e7d4ce mysql:5.7 "docker-entrypoint.s…" 7 seconds ago Up 5 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp docker-mysql
Приведенная выше команда будет отображать только запущенные контейнеры.Если вы хотите отобразить все контейнеры, включая те, которые вышли из выполнения, вы можете добавить параметры.-a,как:
$ docker ps -a
Иногда нам просто нужно найти идентификатор контейнера, мы можем использовать следующую команду:
$ docker ps -aq
Результаты
f4f184f5ffb9
f7d970e7d4ce
стоп-контейнер
Для контейнеров, которые больше не нужны, вы можете использоватьdocker stopкоманда, чтобы остановить его запуск, например:
$ docker stop container_id1,container_id2...
Остановить контейнеры партиями, например:
$ docker stop $(docker ps -qa)
Три режима работы контейнеров
В двух словах,DockerКонтейнеры обычно имеют три режима работы:
Выйти после запуска
Контейнер, созданный следующей инструкцией, завершится после запуска.
$ docker run centos echo "hellowrold"
Резидентная память — это режим процесса демона.
Если в контейнере запущен демон, контейнер всегда будет запущен, например:
$ docker run -d -p 80:80 nginx
интерактивный
Мы также можем напрямую взаимодействовать с контейнером во время его работы.
$ docker run -it centos /bin/bash
удалить контейнер
$ docker container rm container_id
Команда на удаление контейнера тоже записывается лаконично:
$ docker rm container_id
Также можно останавливать контейнеры партиями, как указано выше, и мы также можем удалять контейнеры партиями, например:
$ docker rm $(docker ps -qa)
в контейнер
Для запущенных контейнеров мы также можем передатьdocker execКоманда снова входит в контейнер, например:
$ docker exec -it f4f184f5ffb9 /bin/bash
Вам нужно указать id или имя контейнера.В приведенной выше команде мы используем id.
экспортировать контейнер как изображение
$ docker export -o ./image.tar.gz f4f184f5ffb9
После экспорта контейнера мы можем установить еще одинDockerИмпортируйте пакет файлов в зеркальное отображение на компьютере , например:
$ docker import image.tar.gz
Вышеизложенное касается концепции контейнеров и некоторых часто используемых команд.Что касается контейнеров, вы также можете установить объемы данных и сетевое пространство.У нас есть возможность поговорить об этом позже.
Репозиторий
склад(Repository) — это место, где изображения хранятся централизованно.Здесь есть понятие, которое нужно различать, то есть хранилище и сервер хранилища (Registry) это две разные вещи, как мы сказали вышеDocker Hub,этоDockerОфициальный складской сервер, но на самом деле иногда нам не нужно слишком различать эти два понятия.
общественный склад
Общественные склады обычно относятся кDocker Hub, мы много раз описывали, как добраться изDocker HubДля получения изображения, помимо получения изображения, мы также можем сохранить созданное нами изображение вDocker Hub, чтобы другие тоже могли использовать созданный нами образ.
Но чтобы загрузить изображение вDocker Hub, сначала должно бытьDockerЗарегистрируйте учетную запись на официальном сайте . Интерфейс регистрации выглядит следующим образом. Заполните необходимую информацию, как требуется для регистрации. Это очень просто.
После регистрации вы можете использовать команду для локального входаDokcer Hub, процесс выглядит следующим образом:
# 在命令行中输入
$ docker login
Введите пароль учетной записи для входа вDocker HubПосле этого вы можете использоватьdocker pushкоманда для отправки изображения вDocker Hub.
$ docker push test:1.0
частный репозиторий
Иногда, когда в вашем собственном отделе есть изображения, которыми нужно поделиться, сложнее экспортировать их напрямую другим.Docker HubТакой публичный склад не очень удобен.В это время мы можем построить свой собственный сервис частного склада для хранения и распространения наших изображений.
Dockerофициально предоставленregistryЭтот образ можно использовать для создания службы частного хранилища.После того, как мы вытащим образ на локальный сервер, создайте контейнер образа с помощью следующей команды для создания службы хранилища следующим образом:
$ docker run -d -p 5000:5000 --restart=always --name registry registry
Предположим, мы поместили IP как192.168.0.100server в качестве службы хранилища и запустив указанный выше оператор, мы можем перестроить приведенный выше образ с помощью следующего оператора, например:
$ docker build -t "192.168.0.100/hello-go:1.0" .
Затем используйте следующий оператор для отправки на ваш собственный сервер частного репозитория:
$ docker push 192.168.0.100/hello-word:1.0
резюме
Изображение является статическим понятием и не может быть изменено после завершения построения, в то время как контейнер является динамическим понятием.DockerКонтейнеры можно легко и просто создавать и удалять Отношения между изображениями и контейнерами подобны отношениям между классами и объектами в объектно-ориентированном программировании, а репозиторий — это место, где хранятся и распространяются изображения.
Добро пожаловать, чтобы отсканировать код, чтобы следовать, учиться и прогрессировать вместе