Docker 的用法整理有哪些内容?

2天前 (03-01 01:55)阅读1回复0
zaibaike
zaibaike
  • 管理员
  • 注册排名1
  • 经验值190400
  • 级别管理员
  • 主题38080
  • 回复0
楼主

【docker 简介】 一、什么是docker

官方地址:https://docs.docker.com/

Docker 是一个基于go语言开发的开源的应用容器引擎,闪开发者能够打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也能够实现虚拟化。

二、docker核心概念

docker三大核心概念:镜像 Image、容器 Container、仓库 Repository

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。好比官方镜像 ubuntu:16.04 就包罗了完好的一套 Ubuntu16.04 最小系统的 root 文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象法式设想中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器能够被创建、启动、停行、删除、暂停等。基于镜像能够创建容器,统一个镜像能够创建多个容器;docker面向对象容器对象镜像类仓库(Repository):仓库可看成一个代码控造中心,用来保留镜像。镜像存放在仓库中,能够从仓库中拉取。三、docker架构及原理Docker 利用客户端-办事器 (C/S) 架构形式,利用长途API来办理和创建Docker容器。架构上能够分为客户端和办事端;Docker Daemon是docker的守护历程;containerd是容器运行的历程,是实现容器的核心;客户端通过内部的API和办事端的守护历程停止交互,守护历程再通过containerd分发到各个容器;概念申明Docker 镜像(Images)Docker 镜像是用于创建 Docker 容器的模板。基于镜像能够创建容器,统一个镜像能够创建多个容器;Docker 容器(Container)容器是独立运行的一个或一组应用,是镜像运行时的实体。Docker 客户端(Client)Docker 客户端通过号令行或者其他东西利用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护历程通信。Docker 主机(Host)一个物理或者虚拟的机器用于施行 Docker 守护历程和容器。Docker RegistryDocker 仓库用来保留镜像,能够理解为代码控造中的代码仓库。镜像仓库分为公共镜像仓库Docker Hub和一些私有化摆设的仓库好比:Harbor(那两品种似于github和gitlab)Docker Hub(https://hub.docker.com) 供给了庞大的镜像集合供利用。一个 Docker Registry 中能够包罗多个仓库(Repository);每个仓库能够包罗多个标签(Tag);每个标签对应一个镜像。凡是,一个仓库会包罗统一个软件差别版本的镜像,而标签就常用于对应该软件的各个版本。我们能够通过 <仓库名>:<标签> 的格局来指定详细是那个软件哪个版本的镜像。若是不给出标签,将以 latest 做为默认标签。Docker MachineDocker Machine是一个简化Docker安拆的号令行东西,通过一个简单的号令行即可在响应的平台上安拆Docker,好比VirtualBox、 Digital Ocean、Microsoft Azure。四、docker轻量级的实现原理

docker容器素质上是宿主机的历程,Docker通过namespace实现了资本隔离,通过cgroups实现了资本限造,通过写时复造机造(copy-on-write)实现了高效的文件操做。

namespace资本隔离

linux内核提拱了6种namespace隔离的系统挪用:

namespace系统挪用参数隔离内容UTSCLONE_NEWUTS主机名或域名 (since Linux 2.6.19)IPCCLONE_NEWIPC信号量、动静队列和共享内存(since Linux 2.6.19)PIDCLONE_NEWPID历程编号(since Linux 2.6.24)NetworkCLONE_NEWNET收集设备、栈、端口等(since Linux 2.6.24)MountCLONE_NEWNS挂载点(文件系统)(since Linux 2.6.24)UserCLONE_NEWUSER用户组和用户组(started in Linux 2.6.23 and completed in Linux 3.8)五、docker的优缺点 1.长处更高效操纵系统资本更快速的启动时间一致的运行情况持续交付和摆设更轻松的迁徙2.缺点Docker是基于Linux 64bit的,无法在32bit的 linux/Windows/unix情况下利用Docker并不是合适所有应用场景,Docker只能虚拟基于 Linux的办事Docker实例是无形态的,不会保留当前操做行为的数据:容器销毁后,再次创建容器不会保留之前的数据,一套办法是通过数据挂载手艺将数据挂载到宿主机指定目次来处理此问题,另一个办法是通过docker commit号令来基于已有容器构建为新的镜像,从而到达情况耐久化的目标。【docker 安拆与启动】 一、docker安拆与启动 1.安拆docker的几种体例 1)安拆最新版本docker

① 先卸载旧版本的docker

yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine

② 指定Docker下载源(可选,适用于初次安拆)

yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

③ 安拆Docker(默认安拆最新版本)

yum install -y docker-ce docker-ce-cli containerd.io

④ 验证能否安拆胜利

docker version 2)安拆指定版本的docker yum list docker-ce --showduplicates | sort -r # 查看所有可用版本 yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io # 安拆指定版本 3)通过脚本一键安拆docker

脚本内容如下:

#!/bin/bash echo "set default docker install repo" yum install -y yum-utils yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo echo "install docker ..." yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl status docker 2.启动docker systemctl start docker # 启动办事 systemctl status docker # 查看形态 systemctl stop docker # 停行办事 systemctl restart docker # 重启办事 二、创建第一个docker容器 1.创建容器

根据国际老例,先运行一个hello-world的容器

docker run hello-world # 若是收集等一切一般的话,会呈现如下提醒,暗示容器已经创建胜利 Unable to find image hello-world:latest locally latest: Pulling from library/hello-world 2db29710123e: Pull complete Digest: sha256:18a657d0cc1c7d0678a3fbea8b7eb4918bba25968d3e1b0adebfa71caddbc346 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/ 2.查看容器 docker ps -a # 查看所有容器 # 创建胜利,容器列表中就会有hello-world的容器,但名字不是hello-world,因为我们在运行容器时并未指命名称 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a07f1a8ea1a4 hello-world "/hello" 21 seconds ago Exited (0) 20 seconds ago adoring_chatterjee 三、卸载docker 1.常规体例卸载

① 停行docker办事

systemctl stop docker

② 搜刮已经安拆的docker安拆包

yum list installed | grep docker rpm -qa | grep docker yum -y remove docker-ce.x86_64 yum -y remove docker-ce-cli.x86_64 yum -y remove containerd.io.x86_64

③ 移除所有相关安拆包

yum -y remove contained.io.x86_64

④ 删除docker镜像及相关文件夹

rm -rf /var/lib/docker 2.脚本卸载

所谓的利用脚本安拆和卸载,通俗理解就是把上述多个操做步调的号令放在一个脚本中批量施行,内容如下:

#!/bin/bash systemctl stop docker yum -y remove docker-ce.x86_64 yum -y remove docker-ce-cli.x86_64 yum -y remove containerd.io.x86_64 rm -rf /var/lib/docker rm -rf /etc/docker/daemon.json 【docker 常用操做号令】 一、镜像操做号令号令申明pull拉取镜像search搜刮相关镜像tag重定名镜像rmi删除镜像images 或 image ls查看所有镜像build基于Dockerfile构建镜像commit基于已有容器构建镜像1.拉取镜像

利用"docker pull 镜像名称",拉取长途仓库的镜像到当地(先校验当地能否存在,当地不存在时再默认从官网拉取最新版本的镜像)

以busybox为例:

BusyBox 是一个集成了三百多个最常用Linux号令和东西的软件。BusyBox 包罗了一些简单的东西,例如ls、cat和echo等等,还包罗了一些更大、更复杂的东西,例grep、find、mount以及telnet。有些人将 BusyBox 称为 Linux 东西里的瑞士军刀。简单的说BusyBox就仿佛是个大东西箱,它集成压缩了 Linux 的许多东西和号令,也包罗了 Linux 系统的自带的shell。

docker pull busybox # 拉取镜像

在拉取镜像前,也能够通过docker search号令搜刮差别类型的镜像

docker search busybox # 搜刮相关镜像 2.查看镜像

利用 "docker image ls" 或 "docker images" 号令查看当地已经存在的镜像

docker images # 查看所有镜像 docker images | grep busybox # 查看指定镜像3.修改镜像名称

利用 "docker tag 原始镜像名称 新名称" 号令重定名镜像,如:docker tag busybox:latest mybusybox:V1.0,重定名镜像会新增一条镜像,相当于创建了一个副本,但ID不异。

docker tag busybox:latest mybusybox:V1.04.删除镜像

利用 "docker rmi 镜像名称" 号令删除无用镜像,通过镜像名称删除,只会删除指命名称的镜像;通过镜像ID删除,会删除所有ID不异的镜像。

docker rmi mybusybox:V1.0 docker rmi -f ff4a8eb070e1二、容器操做号令

容器操做号令:

号令申明create创建容器run运行容器,run = pull + create + startexec...-it...sh进入容器内部start启动容器restart重启容器stop停行容器rm删除容器commit基于已有容器构建镜像ps查看容器形态:docker ps -a:查看所有容器docker ps -l:查看比来操做的容器logs查看容器日记:docker logs 容器名:查看指定容器的运行日记docker logs -f 容器名:实时查看指定容器的运行日记

容器操做相关参数:

号令申明--name指定容器名称:--name=容器名--name 容器名-d后台运行-p映射端口,宿主机端口:容器端口,例如:-p 3307:3306-v挂载目次到当地,宿主机目次:容器目次,例如:-v /usr/local/nginx:/usr/local/nginx--restart主动重启,例如:--restart=always,跟从docker办事的重启而重启1.创建容器

docker create (--name=容器名) 镜像名,例如:

docker create --name=mybusybox busybox 2.查看容器形态 docker ps -a # 查看所有容器 docker ps -a | grep mybusybox # 过滤查看指定容器 docker ps -l # 查看比来操做的容器

通过create号令创建完成后的容器是"Created"形态的,能够通过start号令来启动容器

3.启动容器 docker start mybusybox 4.进入容器

通过"docker exec -it 容器名 sh"号令进入容器内部,例如:

docker exec -it mybusybox sh 5.运行容器

docker run = docker pull + docker create + docker start

docker run --name=mynginx -d -p 81:80 nginx 6.停行容器

docker stop 容器名或容器ID,例如:

docker stop mybusybox docker stop 6fbf5a7a580b 7.删除容器

docker rm 容器名或容器ID,删除前要先停行容器,例如:

docker stop mybusybox docker rm mybusybox docker rm 6fbf5a7a580b 8.查看容器日记docker logs 容器名或容器ID:以文件形式查看日记,类似 cat;docker logs 容器名或容器ID:实时查看日记,类似 tail -f;

例如:

docker logs sonic_sonic-server-controller_1 docker logs -f sonic_sonic-server-controller_1 9.基于已有容器构建为新的镜像模板

用法:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

OPTIONS释义-a标注做者信息-c利用Dockerfile指令来生成镜像-m提交申明信息,类似于git commit -m "xxxx"-p在提交时,暂停容器

例如:当前有个需求,将当前办事器上正在运行的一个容器,无痕迁徙到另一台办事器上运行。意味着需要施行以下步调:

将当前正在运行的容器构建为新的镜像A>>将新镜像A的镜像文件复造到另一台办事器或间接将镜像A提交到镜像仓库>>在另一台办事器上将镜像A从镜像仓库下载下来>>基于镜像A创建容器并运行

① 打包涵器

为了便于演示,先将一份文件复造到已有容器内

docker cp jdk_install.sh mysql:/home

② 查看容器内文件

docker exec -it mysql sh

能够看到,已经将jdk_install.sh文件复造到了mysql容器的/home目次下:

③ 基于容器构建新的镜像

docker commit -a "chenjigang" mysql new-mysql

通过"docker images"号令查看当前镜像列表,能够看到名为new-mysql的镜像:

④ 基于新镜像运行容器

docker run -d --name new-mysql-container -e MYSQL_ROOT_PASSWORD=123456 -p 3308:3306 new-mysql

⑤ 查看容器内文件

docker exec -it new-mysql-container sh

通过下图能够看出,之前复造到容器内的jdk_install.sh文件,已经保留到镜像中、并跟从呈现在新的容器内:

【docker 利用技巧】 一、改换镜像源

1.设置装备摆设文件途径:/etc/docker/daemon.json,若不存在则新建此文件

{ "registry-mirrors":[ "http://registry.docker-cn.com", "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com", "http://cr.console.aliyun.com/", "https://8wb4g36l.mirror.aliyuncs.com" ] }

2.设置装备摆设完成后重启docker办事

systemctl restart docker.service 二、改换存储目次

docker安拆完成后,默认存储途径为/var/lib/docker。创建容器后,每个容器的数据卷容量上限与/var/lib/docker所在的挂载的磁盘大小有关。例如下图所示:挂载的磁盘大小为50GB,则docker容器数据卷上限就是50GB,若是有多个容器,则那些容器共享50GB的容量,并且同时也与挂载磁盘下的其他目次共享利用。那么若是运行的容器数量较多,或是碰到需要存储大量数据如gitlab那类容器,50G显然就有些捉襟见肘。此时能够通过修改docker存储途径的体例扩容容器的容量上限。出格提一句,docker存储途径更好尽早修改,如许能够制止后期因磁盘写满招致的各类容器运行异常问题。

三种体例修改docker存储途径,别离为:

1.体例一:修改docker设置装备摆设文件

编纂docker设置装备摆设文件

vi /usr/lib/systemd/system/docker.service

利用"--graph"或"-g"参数指定存储位置

ExecStart=/usr/bin/dockerd --graph /home/docker_home

修改完成后从头加载设置装备摆设文件并重启docker办事

// reload设置装备摆设文件 systemctl daemon-reload // 重启docker systemctl restart docker.service 2.体例二:创建daemon.json文件

docker1.12或以上版本,能够创建或修改daemon.json文件来指定存储位置。docker查看版本号令“docker version”

vi /etc/docker/daemon.json

在最初添加graph字段,定义docker目次

{ "registry-mirrors":[ "http://registry.docker-cn.com", "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com", "http://cr.console.aliyun.com/", "https://8wb4g36l.mirror.aliyuncs.com" ], "graph": "/home/docker_home" }

修改完成后同样需要从头加载设置装备摆设文件、重启docker办事

systemctl daemon-reload systemctl restart docker.service 3.体例三:创建软链接(保举)

前两种体例适用于初次安拆docker后没有pull过镜像、创建过容器。即便修改了存储途径,因为没有镜像和容器,所以也不会产生任何影响。

创建软链接的体例,适用于已经创建过容器、而且容器已经产生数据的情况。那种体例能够制止对镜像及现有容器数据形成毁坏,以及更改存储途径后找不到数据的情况。详细步调如下:

① 查看docker途径

默认情况下Docker的存放位置为:/var/lib/docker,也能够通过如下号令查看docker存储途径

docker info | grep "Docker Root Dir"

② 停掉docker办事

systemctl stop docker

③ 挪动docker目次

mv /var/lib/docker /home/docker_home

③ 创建软链接

/home/docker_home为源文件目次,也就是新设置的docker存储目次/var/lib/docker为软链接目的目次,与此目次成立链接后,相当于本来的docker设置装备摆设连结稳定,但实正的存储目次是其背后所指向的/home/docker_homeln -s /home/docker_home /var/lib/docker

④ 启动docker办事

systemctl start docker

修改完成后,我们能够通过以下号令查看docker的存储目次:

docker info | grep "Root Dir" # 修改胜利会返回以下内容: # Docker Root Dir: /home/docker_home

查看/var/lib/目次,docker目次是一个软链接,指向/home/docker_home,设置装备摆设准确。

三、修改时区 1.创建容器时设置时区

创建时增加映射利用主机时区

-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime 2.创建容器后修改时区

① 查看宿主机时区

通过date -R号令能够看出,宿主机的时区为东八区,查看/etc/localtime,能够看出localtime现实上是一个软链接,背后指向的是/usr/share/zoneinfo/Asia/Shanghai

[root@test_host home]# date -R Thu, 08 Sep 2022 11:05:37 +0800 [root@test_host home]# ls -l /etc/localtime lrwxrwxrwx. 1 root root 35 8月 29 17:17 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

② 拷贝当地时区到docker容器内部

docker cp /usr/share/zoneinfo/Asia/Shanghai docker.ui:/etc/localtime

③ 进入容器内部查看时区

docker exec -it docker.ui sh # 进入docker.ui容器 ls /etc # 查看/etc下能否存在已经复造的localtime文件 date -R # 查看时区

通过下图能够看出,/etc下已经存在了宿主机复造过来的localtime文件,时区为东八区,已经批改。

四、拷贝文件

次要用到"docker cp"号令

1.从宿主机拷贝到容器

docker cp 宿主机文件途径 容器名:目次,例如:

docker cp redis_log mysql:/home 2.沉着器内拷贝到宿主机

docker cp 容器名:文件途径 宿主机目次,例如:

docker cp mysql:/home/mayfly-go.sql /home/ 五、常见问题处理 1.容器报错ipv4收集不成用 运行容器时报错

若是是容器运行间接报那个错, 处理体例:

① 在宿主机上施行 echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf

② 重启network和docker办事

systemctl restart network systemctl restart docker 创建容器时报错

“WARNING: IPv4 forwarding is disabled. Networking will not work.”

若是是运行镜像、创建容器的时候报那个错,则间接重启docker办事:

systemctl restart docker 【docker 一键快速搭建情况】 1.docker一键搭建Jenkins # 拉取镜像 docker pull jenkins # 运行容器 docker run -d --name=jenkins -v /home/jenkins:/var/jenkins_home -p 8088:8080 -u root --restart=always jenkins

前台拜候:http://192.168.1.122:8088/

留意:初次拜候需输入密码,宿主机上密码文件途径为 /home/jenkins/secrets/initialAdminPassword,或是进入容器内查看:/var/jenkins_home/secrets/initialAdminPassword

初始化完成后,原始密码文件主动删除:

2.docker一键搭建Gitlab # 拉取镜像 docker pull gitlab/gitlab-ce # 创建gitlab情况变量 export GITLAB_HOME=/home/gitlab # 运行容器 docker run -d --name=gitlab -u root --restart=always -v $GITLAB_HOME/config:/etc/gitlab -v $GITLAB_HOME/logs:/var/log/gitlab -v $GITLAB_HOME/data:/var/opt/gitlab -p 443:443 -p 8081:80 -p 2222:22 gitlab/gitlab-ce

http://192.168.1.122:8081/ 初次拜候会提醒修改密码,用户名为 root

3.docker一键搭建Nginx

官网地址:https://hub.docker.com/_/mysql

# 拉取镜像 docker pull nginx # 运行容器 docker run -d --name mynginx -p 81:80 nginx

阅读器端拜候:http://192.168.1.123:81/

4.docker一键搭建MySQL

官网地址:https://hub.docker.com/_/mysql

# 拉取镜像 docker pull mysql # 运行容器 docker run -d -e MYSQL_ROOT_PASSWORD=123456 --name=mymysql -p 3307:3306 mysql # 进入mysql容器 docker exec -it mysql sh # 登录mysql mysql -uroot -p123456

mysql号令行操做

利用东西毗连mysql数据库

5.一键搭建RabbitMQ # 拉取镜像 docker pull rabbitmq:3.7-management # 启动容器 docker run --name=rabbitmq -d --restart always -p 15672:15672 -p 5672:5672 -v /home/rabbitmq:/var/lib/rabbitmq rabbitmq:3.7-management

注:若是docker pull rabbitmq后面不带management,启动rabbitmq后是无法翻开办理界面的,所以我们需要下载带management插件的rabbitmq

阅读器端拜候:http://192.168.1.123:15672/,登录账号和密码都是:guest

【dockerfile 定造镜像】 一、Dockerfile是什么? 1.简介

Dockerfile 是一个用来构建镜像的文本文件,文本内容包罗了一条条构建镜像所需的指令和申明。

2.感化

Dockerfile的感化:定造镜像,所谓定造镜像,就是以一个镜像为根底,在其长进行定造,丰硕功用、提早做一些设置装备摆设等。

二、Dockerfile常用指令 1.常用指令释义指令申明FROM指定根底镜像MAINTAINER增加申明信息,如维护者姓名邮箱等,非必需RUN施行详细的linux号令(用于构建镜像时施行相关的号令)USER基于哪个用户运行容器ADD将当地的文件添加到镜像内(撑持正则表达式拷贝,撑持更多的文件类型的拷贝,如收集文件的下载后拷贝,ADD http://xxxx/test.tar.gz /test/)COPY将当地文件拷贝到镜像内(只撑持根本的文件、文件夹的拷贝,保举利用COPY),更好将要拷贝的文件置于Dockerfile统一目次下WORKDIR目次切换指令,类似于linux的cd号令WORKDIR /home/jenkins_home/conf 等同于以下指令:WORKDIR /homeWORKDIR jenkins_home/confEXPOSE指定容器监听的端口,仅做为申明,不会实正生效,仍是需要利用docker run -p参数停止端口映射CMD类似于RUN指令,区别与CMD是在启动容器时施行相关的号令,CMD echo "hello world" 或 [ECHO,hello world]都能够,保举利用后者列表形式ENTRYPOINT指定ENTRYPOINT参数后,利用docker run xxxx 启动容器时,docker run 后面的参数不会被笼盖ENV指定运行容器时的情况变量,格局为 KEY=VALUE或KEY VALUE,如ENV VERSION=2.0在后续指令中能够利用$VERSION停止替代2.0VOLUME数据栈声明,做匿名挂载用,假设指令为VOLUME /usr/local,则在启动容器后会在办事器上docker默认途径/var/lib/docker/volumes/下主动生成一个文件夹,用于挂载/usr/local,常用于施行docker run号令时忘记指定-v 参数,从而主动保留一些重要的数据时利用2.CMD、ENTERPOINT、docker run xxx 三者之间的区别与联络若指定了CMD [ECHO,hello world],同时利用了docker run -p 8080:80 xxx,则docker run 后面的参数会笼盖CMD后面的指令;若指定了ENTRYPOINT [nginx],同时利用了docker run -p 8080:80 xxx,则会把docker run 后面的参数做为参数传递给ENTRYPOINT,与ENTRYPOINT后面的参数拼接起来;若CMD [ECHO,hello world],同时指定了ENTRYPOINT [nginx],则会把CMD后的参数做为参数传递给ENTRYPOINT,与ENTRYPOINT后面的参数拼接起来;

总结:CMD相对更为灵敏,用户能够通过docker run 更改dockerfile中CMD的指令,而ENTRYPOINT则更为单一,利用docker run号令行参数启动容器时无法修改dockerfile中ENTRYPOINT的指令;

3.Dockerfile示例 自定义Dockerfile

如下,我们造做一个简单的Dockerfile用来构建镜像,它是基于centos7镜像。此中,施行一些简单的号令,如输出信息、创建文件夹,别的提早添加文件到镜像目次、切换目次,最初安拆一件东西,施行查看网卡号令:

# 基于centos7镜像 FROM centos:7 # 维护者信息 MAINTAINER "chenjigang" # 基于root用户运行容器 USER root # 运行号令 RUN echo "test dockerfile..." RUN mkdir -p /home/docker_home # 当地复造文件到镜像内 COPY docker_install.sh /home/docker_home/docker_install.sh # 切换目次 WORKDIR /home/docker_home RUN ls -al RUN yum install -y net-tools RUN ifconfig mysql示例

下图是MySQL的官方镜像的dockerfile,也是用到了上面介绍的各个号令,将其有机地连系,例如:一起头会添加一份文件>>然后运行bash>>创建用户和用户组>>中间设置情况>>设置数据目次>>最初启动mysqld,从而实现MySQL的构建:

三、从Dockerfile构建镜像

Dockerfile 创建完成后,能够利用 docker build 号令按照 Dockerfile 构建一个镜像。Docker build常用的指令包罗两个参数:

-t 指定镜像的名字-f 显示指定构建镜像的 Dockerfile 文件,若当前操做目次与Dockerfile文件处于统一目次,则利用.也能够,不然需利用 -f 参数指定Dockerfile文件途径(注:Dockerfile 定名为非固定数名,可更改)

基于上面第一个Dockerfile提交构建:

# 运行当前目次下的Dockerfile文件,生成一个名为mycentos7的镜像 docker build -t mycentos7 .

如下图所示,运行docker build构建镜像号令后,正在根据上述自定义的Dockerfile中的步调挨次施行:

从下图能够看出,已经胜利构建了一个镜像:mycentos7:latest

查看镜像列表,存在新构建的镜像mycentos7:

基于mycentos7镜像创建一个容器:

docker run -it --name mycentos7 mycentos7:latest sh

此时,启动容器,进入镜像shell情况内会发现Dockerfile文件中定义的号令已生效:

指定的docker_install.sh已复造到mycentos镜像的/home/docker_home文件夹下;net-tools东西已提早安拆胜利,"ifconfig"号令能够一般施行;四、Dockerfile构建镜像原理

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

每多一行号令,镜像就会多一层

【docker-compose 容器编排】 一、Docker-Compose介绍 1.简介

Docker-Compose项目是Docker官方的开源项目,负责实现对Docker多容器编排办理系统。利用 Docker-compose,能够用一个 YAML 文件定义一组要启动的容器,以及容器运行时的属性。 Docker-Compose的工程设置装备摆设文件默认为docker-compose.yml

项目地址:https://github.com/docker/compose

2.Docker-Compose宿世此生

Docker Compose 的前身是 Fig,现阶段 Docker Compose 是 Docker 官方的单机多容器办理系统(不克不及跨机器),它素质是一个Python 脚本,它通过解析用户编写的 yaml 文件,挪用 Docker API 实现动态的创建和办理多个容器。

二、Docker-Compose安拆 1.利用curl号令安拆(保举) # 下载 Docker Compose 的安拆包 sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 修改 Docker Compose 施行权限 sudo chmod +x /usr/local/bin/docker-compose2.利用PIP安拆

需提早安拆Python情况

pip install -U docker-compose 三、Docker-Compose常用指令构成

Docker Compose 文件次要分为三部门: services(办事)、networks(收集) 和 volumes(数据卷)

1.常用指令申明指令申明image镜像名称,基于哪个镜像,利用现有的镜像build利用自定义的镜像,若当前docker-compose.yml和Dockerfile在统一途径下,则build的键值用 . 也能够,若不在统一途径下,或Dockerfile文件不是用的默认名称Dockerfile,则需指定Dockerfile的途径command启动镜像时用的号令,类似于Dockerfile中的CMD指令container_name容器名称depends_on指定办事启动挨次,如存在多个办事nginx、db、Jenkins时,则在Jenkins办事下定义depends_on: db,会优先启动db办事links处理容器之间的链接,利用db能够链接到db办事,利用别号test_db也能够ports指定端口,端口映射时利用,类似于docker号令中的-p参数volumes数据挂载时利用,类似于docker号令中的-v参数2.docker-compose.yml示例

撑持四种定名格局:docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml

sonic私有云实机平台:http://192.168.1.20:3000/Index/Devices

下面就以前面分享过的《开源云实机平台-Sonic应用理论》中的sonic办事的docker-compose.yml为例,一路来看看上述指令的用法:

version: 3 # 版本 services: # 办事, sonic-server-eureka: # 容器名(sonic微办事注册中心) image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-eureka:v1.5.0-release" hostname: sonic-server-eureka environment: # 情况,读取设置装备摆设文件中eureka的用户名密码等 - SONIC_EUREKA_USERNAME - SONIC_EUREKA_PASSWORD - SONIC_EUREKA_PORT - SONIC_EUREKA_HOST=sonic-server-eureka volumes: # 目次映射 - ./logs/:/logs/ networks: # 收集名 - sonic-network ports: # 端口映射 - "${SONIC_EUREKA_PORT}:${SONIC_EUREKA_PORT}" sonic-server-gateway: # 容器名(sonic微办事网关) image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-gateway:v1.5.0-release" hostname: sonic-server-gateway environment: # 同样也是一些情况设置装备摆设,用于和eureka容器通信 - SONIC_EUREKA_USERNAME - SONIC_EUREKA_PASSWORD - SONIC_EUREKA_PORT - SONIC_EUREKA_HOST=sonic-server-eureka - SECRET_KEY - EXPIRE_DAY volumes: - ./logs/:/logs/ depends_on: # 指定办事启动挨次,先启动sonic-server-eureka容器 - sonic-server-eureka networks: # 收集,各个容器必需处于统一收集下才气彼此通信 - sonic-network restart: on-failure sonic-server-controller: # 容器名 image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-controller:v1.5.0-release" environment: # 情况设置装备摆设,读取数据库、账号等设置装备摆设 - SONIC_EUREKA_USERNAME - SONIC_EUREKA_PASSWORD - SONIC_EUREKA_PORT - SONIC_EUREKA_HOST=sonic-server-eureka - MYSQL_HOST - MYSQL_PORT - MYSQL_DATABASE - MYSQL_USERNAME - MYSQL_PASSWORD - SONIC_SERVER_HOST - SONIC_SERVER_PORT - SECRET_KEY - EXPIRE_DAY - REGISTER_ENABLE - NORMAL_USER_ENABLE - LDAP_USER_ENABLE - LDAP_USER_ID - LDAP_BASE_DN - LDAP_BASE - LDAP_USERNAME - LDAP_PASSWORD - LDAP_URL networks: - sonic-network volumes: - ./logs/:/logs/ depends_on: - sonic-server-eureka restart: on-failure sonic-server-folder: image: "registry.cn-hangzhou.aliyuncs.com/sonic-cloud/sonic-server-folder:v1.5.0-release" environment: - SONIC_EUREKA_USERNAME

通过上述设置装备摆设我们可以发现,docker-compose.yml那个设置装备摆设文件,就是由前面我们介绍的一个个指令根据必然的格局、挨次、规则停止摆列、相连系构成,从而实现差别容器的排编,彼此通信,进而实现强大的功用。

四、Docker-Compose操做号令

用法:

Define and run multi-container applications with Docker.

Usage:

docker-compose [-f ...] [--profile ...] [options] [--] [COMMAND] [ARGS...]

docker-compose -h|--help1.docker-compose操做号令 官方所有指令常用指令指令申明up启动容器编排(前提是当前目次存在docker-compose.yml文件)down删除容器编排,适用于docker-compose.yml文件发作变动、或安拆出错时的卸载重拆ps查看所有办事形态,类似于docker ps -astart启动办事stop指定办事启动挨次,如存在多个办事nginx、db、Jenkins时,则在Jenkins办事下定义depends_on: db,会优先启动db办事logs查看docker-compose操做日记2.docker-compose操做参数 官方所有选项常用选项参数申明-f指定yml文件启动,当前目次下不存在docker-compose.yml文件时利用-d后台运行3.容器编排操做理论 启动容器编排 docker-compose up # 启动容器(前提是当前目次存在docker-compose.yml文件) docker-compose -f docker-compose.yml up -d # 指定yml文件启动并设置后台运行

启动容器编排:创建收集>>创建并运行各个容器>>各个容器之间成立毗连

在利用"docker-compose up"和"docker-compose down"号令时,若当前目次下不存在以下四种中的任一格局文件:docker-compose.yml, docker-compose.yaml, compose.yml, compose.yaml,或也未利用-f参数指定其他文件时,会报错提醒:

删除容器编排 docker-compose down

删除容器编排:停行各个容器>>移除各个容器>>删除容器创建的收集

查看容器形态 docker-compose ps # 查看所有办事形态,类似于docker ps -a启动办事 # docker-compose start 启动所有办事 # docker-compose start [SERVICE...] 启动指定办事 docker-compose start停行办事 # docker-compose stop 停行所有办事 # docker-compose stop [options] [SERVICE...] 停行指定办事 docker-compose stop

与down号令差别,stop只会停行相关容器,但不会删除相关容器

查看日记 docker-compose logs 五、操纵Docker Compose搭建wordpress博客系统

前面临一些常用指令做了申明,以及通过sonic前后台办事的docker-compose.yml案例对容器编排做了简单介绍,下面我们连系一个docker-compose搭建WordPress的案例来搭建我们本身的容器编排办事,官方设置装备摆设文件内容如下:

1.设置装备摆设docker-compose.yml

官网地址:https://docs.docker.com/compose/wordpress/

services: db: # We use a mariadb image which supports both amd64 & arm64 architecture image: mariadb:10.6.4-focal # If you really want to use MySQL, uncomment the following line #image: mysql:8.0.27 command: --default-authentication-plugin=mysql_native_password volumes: - db_data:/var/lib/mysql restart: always environment: - MYSQL_ROOT_PASSWORD=somewordpress - MYSQL_DATABASE=wordpress - MYSQL_USER=wordpress - MYSQL_PASSWORD=wordpress expose: - 3306 - 33060 wordpress: image: wordpress:latest volumes: - wp_data:/var/www/html ports: - 88:80 restart: always environment: - WORDPRESS_DB_HOST=db - WORDPRESS_DB_USER=wordpress - WORDPRESS_DB_PASSWORD=wordpress - WORDPRESS_DB_NAME=wordpress volumes: db_data: wp_data:

【留意】

上述设置装备摆设内容是能够自在修改的,其实不必然要根据它的来,好比我当地就有MySQL,那就不需要再设置装备摆设一个mysql或mariadb的容器yml文件中冒号后面要带空格,严酷标准格局2.查看容器形态 docker-compose ps -a3.前端拜候

启动docker-compose,各个容器处于up形态,此时就能够拜候前端页面,http://192.168.1.123:88/,会先辈行安拆设置装备摆设,如:设置数据库、站点取名

小我博客主页如下:

因为我是内网办事器,只能在局域网内拜候,公网无法拜候。若是你有一台带有公网的云办事器,如阿里云,那么妥妥的就能够搭建本身的小我网站了,那种对办事器要求不高,入门级的就能够。如今的云办事器都挺廉价,一年才几十块钱,像阿里云办事器小我用户能够免费体验一个月。关于WordPress详细搭建办法能够参考我前面介绍的《用2核2G的入门级云办事器搭建WordPress博客系统》

【docker 镜像仓库】

在前面的文章中,我们介绍了若何定造镜像、容器编排,但似乎对镜像办理并没有提及,那么镜像文件我们能否能够像办理代码一样实现push、pull的操做呢?谜底是有的,docker-hub就是一款公共仓库,在上面能够搜刮到他人创建好的各类各样的镜像,以及办理本身的镜像;Harbor是一款私有化镜像仓库,我们能够把镜像上传上去,统一内网下的其他用户均能够下载利用,因为是摆设在本身的办事器,因而关于平安性那方面更有保障。docker-hub和Harbor的关系我们能够类比成GitHub和Gitlab。

一、公共镜像仓库Docker-hub 1.docker-hub简介

公共镜像仓库一般是 Docker 官方或者其他第三方组织(阿里云,腾讯云,网易云等)供给的,允许所有人注册和利用的镜像仓库。Docker Hub 是全球更大的镜像市场,目前已经有超越 10w 个容器镜像。

2.提交镜像到仓库

详细步调:注册账号>>登录>>创建仓库>>>linux号令行docker登录>>修改镜像名称(连结与仓库名称一致)>>提交镜像到仓库

① 创建镜像仓库

类似于github上创建代码仓库,分为public(公开的,互联网可见)和private(受庇护的,尽本身可见)两种。

② Linux号令行登录Docker账号 docker login # 登录docker-hub③ 修改镜像名称,连结与镜像仓库一致 docker tag joinsunsoft/docker.ui:latest chenjigang/auto-test:v1.1④ 提交镜像到公共仓库 docker push chenjigang/auto-test:v1.1⑤ 查看镜像仓库二、私有化镜像仓库Harbor 1.Harbor简介

Harbor是由VMware公司开源的企业级的Docker Registry办理项目,它包罗权限办理(RBAC)、LDAP、日记审核、办理界面、自我注册、镜像复造和中文撑持等功用。

做为一个企业级私有 Registry 办事器,Harbor 供给了更好的性能和平安。提拔用户利用 Registry 构建和运行情况传输镜像的效率。Harbor 撑持安拆在多个 Registry 节点的镜像资本复造,镜像全数保留在私有 Registry 中, 确保数据和常识产权在公司内部收集中管控。别的,Harbor 也供给了高级的平安特征,诸如用户办理,拜候控造和活动审计等。

基于角色的拜候控造 - 用户与 Docker 镜像仓库通过 “项目” 停止组织办理,一个用户能够对多个镜像仓库在统一定名空间(project)里有差别的权限。镜像复造 - 镜像能够在多个 Registry 实例中复造(同步)。尤其合适于负载平衡,高可用,混合云和多云的场景。图形化用户界面 - 用户能够通过阅读器来阅读,检索当前 Docker 镜像仓库,办理项目和定名空间。AD/LDAP 撑持 - Harbor 能够集成企业内部已有的 AD/LDAP,用于鉴权认证办理。审计办理 - 所有针对镜像仓库的操做都能够被记录逃溯,用于审计办理。国际化 - 已拥有英文、中文、德文、日文和俄文的当地化版本。更多的语言将会添加进来。RESTful API - RESTful API 供给给办理员关于 Harbor 更多的操控,使得与其它办理软件集成变得更容易。摆设简单 - 供给在线和离线两种安拆东西, 也能够安拆到 vSphere 平台 (OVA 体例) 虚拟设备。

gitee地址:https://gitee.com/project_harbor/harbor?utm_source=alading&utm_campaign=repo

2.Harbor搭建

安拆申明: Harbor的所有办事组件都是在Docker中摆设的,所以官方安拆利用Docker-compose快速摆设,所以需要安拆 Docker、Docker-compose。因为Harbor是基于Docker Registry V2版本,所以就要求Docker版本不小于1.10.0, Docker-compose版本不小于1.6.0。

① 下载并解压安拆包

在线下载:

wget https://github.com/goharbor/harbor/releases/download/v2.2.2/harbor-online-installer-v2.2.2.tgz tar -xvf harbor-online-installer-v2.2.2.tgz ② 编纂设置装备摆设文件 cp harbor.yml.tmpl harbor.yml # 复造一份harbor.yml文件 vi harbor.yml

根据如下内容编纂:

hostname改为本机ip端口默认80,能够改为其他指定端口正文掉https的相关设置装备摆设③ 筹办安拆情况 ./prepare # 施行prepare脚本

施行完成后,当地会多一个docker-compose.yml文件和common目次

④ 安拆harbor ./install.sh # 安拆harbor

安拆过程中会主动下载harbor镜像并启动相关容器。

⑤ 拜候harbor

安拆胜利后,即可拜候harbor:http://192.168.1.122:8087,此中:ip为本机ip,端口为设置装备摆设文件harbor.yml中设置装备摆设的端口。默认账号和密码为:admin Harbor12345

harbor.yml文件中可查看或修改密码

⑥ 安拆过程中常见问题及处理报错redis容重视复

原因:当地已存在redis容器,harbor无法启动redis容器

处理法子:修改harbor目次下docker-compose.yml中的redis容器名称,从头启动

docker-compose up -d

查看harbor各个容器形态:

报错registry容重视复

若当地之前已存在registry容器时,harbor安拆过程会报错,处理计划:删除原registry容器,从头施行./install.sh停止安拆;若此体例仍报错,则施行docker-compose up -d启动各个办事;

3.推送当地镜像到Harbor ① 创建项目② Docker登录

因为之前登录过docker-hub,所以再次利用“docker login”号令登录时,默认登录的仍是docker-hub的地址。因而,若是想要登录harbor,需要在登录时指定登录地址。

docker login 192.168.1.122:8087

初次登录,按照提醒输入harbor用户名及密码即可,与前端登录利用的账号密码一致。

因为我前面登录过一次那个地址,当地会保留认证记录,因而再次登录时无需输入用户名密码即可登录胜利。

如遇以下报错:

则要在/etc/docker/daemon.json文件中将本机ip(端口非80时需要带上端标语)参加到insecure-registries列表中,并重载设置装备摆设。

{ "registry-mirrors":[ "http://registry.docker-cn.com", "http://docker.mirrors.ustc.edu.cn", "http://hub-mirror.c.163.com", "http://cr.console.aliyun.com/", "https://8wb4g36l.mirror.aliyuncs.com" ], "insecure-registries":["192.168.1.122:8087"], "graph": "/home/docker_home" }systemctl daemon-reload systectl restart docker

再次登录后登录胜利:

③ 当地镜像打tag

镜像名称需要定名为:ip:端标语/项目名称/镜像名:tag名,才气上传到该指定项面前目今,例如rabbitmq镜像,则名称为:192.168.1.122:8087/harbor/rabbitmq:5.7.33

为了便利测试,我间接复造当地的一个镜像,并从头定名:

docker tag rabbitmq:3.7-management 192.168.1.122:8087/harbor/rabbitmq:3.7-management④ 推送当地镜像到Harbor docker push 192.168.1.122:8087/harbor/rabbitmq:3.7-management

查看名为harbor的项面前目今,存在rabbitmq:3.7-management,测试胜利。

⑤ 从Harbor拉取镜像拉取镜像docker pull 192.168.1.122:8087/library/mysql:5.7.33

从下图能够看出,MySQL镜像已经拉取胜利

同时,Harbor办理端也能看到最新的拉取时间:

创建容器docker run -it -d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql -p 3307:3306 192.168.1.122:8087/library/mysql:5.7.33

登录MySQL

【docker 可视化办理东西-DockerUI】 一、简介

DockerUI是一款开源的、强大的、轻量级的Docker办理东西。DockerUI笼盖了 docker cli 号令行 95% 以上的号令功用,通过可视化的界面,即便是不熟悉docker号令的用户也能够十分便利的停止Docker和Docker Swarm集群停止办理和维护。

DockerUI后端利用Go语言开发,前台框架利用CubeUI。通过Docker Restful API,颠末Go语言编写的Proxy端, 实现和Docker Daemon停止通信,从而实现Docker的办理号令和维护号令。

官网:https ://github.com/gohutool/docker.ui

二、特征Docker主机办理办理 数据卷办理、镜像办理、容器办理、构建办理、仓库设置装备摆设办理、收集设置装备摆设办理Docker swarm集群办理 集群设置装备摆设信息、节点办理、办事办理、使命办理、密码办理、设置装备摆设办理使命摆设 Docker使命调度、docker swarm使命调度三、安拆 1.常规体例安拆 1)下载docker.ui源码 git clone https://github.com/gohutool/docker.ui.git 2)安拆golang运行情况

① 创建go文件夹

cd /home mkdir go

② 下载go压缩包并解压缩

https://golang.google.cn/dl/,选择对应系统下载文件

也能够通过wget号令下载:

wget https://golang.google.cn/dl/go1.19.1.linux-amd64.tar.gz tar -xvf go1.19.1.linux-amd64.tar.gz

③ 添加到情况变量

编纂/etc/profile,添加如下内容:

export GO_HOME=/home/golang/go export PATH=$PATH:$GO_HOME/bin

④ 重载情况变量

source /etc/profile

⑤ 验证能否安拆胜利

go --help

呈现以下信息暗示安拆设置装备摆设胜利:

3)项目设置装备摆设

进入docker.ui项目目次,施行以下号令

export GO111MODULE=on export GOPROXY="https://goproxy.cn,direct" go mod tidy go mod download go build -o server . # 施行完成后目次下会多出一个server文件 4)启动办事 ./server 2.通过容器安拆 1)拉取镜像 docker image pull joinsunsoft/docker.ui 2)创建容器 docker run --restart always --name docker.ui -d -v /home/docker_data/docker.ui/docker.sock:/var/run/docker.sock -p 8999:8999 joinsunsoft/docker.ui 3.阅读器拜候

http://192.168.1.122:8999

默认账号密码:ginghan 123456

四、操做快照 镜像列表搜刮/拉取镜像构建镜像导入/导出镜像推送镜像施行镜像

0
回帖

Docker 的用法整理有哪些内容? 期待您的回复!

取消