Docker的部署与基础操作
Docker的部署与基础操作
一、Docker简介
Docker 是一个开源的容器化平台,它允许开发者将应用程序和其依赖的环境打包成一个独立的容器,然后在任何支持 Docker 的环境中运行。它使用了操作系统级的虚拟化技术,可以在不同的操作系统上实现相同的运行环境,提供了轻量级、可移植、可扩展和可复用的容器解决方案。 Docker 的核心概念是镜像、容器和仓库。镜像是一个只读的模板,包含了运行应用程序所需的所有文件和配置。容器则是基于镜像创建的一个运行实例,它可以被启动、停止、删除和重启。仓库是存储和管理镜像的地方。。通过使用镜像和容器,开发者可以实现应用程序的快速部署、可移植性和隔离性。 Docker 提供了丰富的命令行工具和图形界面工具,使得开发者可以方便地管理和操作容器。它还提供了一个集中化的公共镜像仓库 Docker Hub,用户可以在其中搜索、下载和分享 Docker 镜像。Docker Hub 包含了大量的官方和社区维护的镜像,涵盖了各种常见的软件和服务。 Docker 的优势在于其轻量级和快速启动的特性,使得应用程序能够更加高效地运行和扩展。它还提供了强大的容器隔离机制,使得多个应用程序可以在同一台主机上运行,互不干扰。此外,Docker 还支持自动化构建和部署的工作流程,使得应用程序的开发和发布更加简单和可靠。
二、Docker安装
使用yum安装Docker
#安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加阿里云信息
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
#快速更新本地软件包缓存
yum makecache fast
#更新并安装Docker-CE
yum -y install docker-ce
#也可以选择安装docker版本
#查看docker版本
yum list docker-ce.x86_64 --showduplicates | sort -r
#指定安装docker版本
yum -y install docker-ce-[VERSION]
例如 yum -y install docker-ce-18.06.0.ce-3.el7
#启动docker
systemctl start docker
#设置docker为开机自启
systemctl enable docker
#查看docker版本
docker --version
三、设置国内docker镜像源
Docker默认使用的Docker镜像源为Docker hub。Docker Hub 是一个集中化的公共镜像仓库,用户可以在其中搜索、下载和分享 Docker 镜像。它包含了大量的官方和社区维护的镜像,包括各种操作系统、编程语言、数据库等常见的软件和服务。
除了 Docker Hub,用户也可以配置自定义的镜像源。对于中国用户,由于网络环境的原因,访问 Docker Hub 可能会受到限制或者速度较慢。为了解决这个问题,可以使用国内的镜像加速器,例如阿里云容器镜像服务、DaoCloud 等,这些加速器会在 Docker 的配置文件中设置一个 registry-mirrors 参数,指定镜像加速器的地址。设置之后,Docker 将从指定的镜像加速器下载镜像,加快下载速度。#阿里加速器获取地址,登录后即可找到自己的专属地址
#【https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors】
#针对Docker客户端版本大于 1.10.0 的用户
#您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器,此文件默认没有,需要自己手动添加
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":[
"https://coub04fo.mirror.aliyuncs.com", //此为阿里个人专属加速器,请自行注册
"https://f1361db2.m.daocloud.io/",
"https://registry.docker-cn.com/",
"https://docker.mirrors.ustc.edu.cn/", //科大镜像
"https://hub-mirror.c.163.com/" //网易
]
}
systemctl daemon-reload
systemctl restart docker
四、镜像的基本操作
显示本机上的镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
base 镜像有两层含义:
docker images --no-trunc //完整版image ID
docker images -q //只显示ID
docker rmi //删除镜像
查找镜像(images)获取某个仓库中的镜像
docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
image名字 描述 星级(表示该image的受欢迎度) 是否为官方创建 是否自动创建
注:使用docker search 命令可以在docker hub的网站上来查找他们,这里以centos为例
获取镜像
docker pull centos
注:这里以centos为例下载
查看镜像基本信息
【Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]】
docker inspect centos:latest
选项:
-f 使用给定的Go模板格式化输出
-s 如果类型为容器,则显示总文件大小
--type string 返回指定类型的JSON
五、创建自己的image
方法1:使用 docker commit 来扩展一个 image 先使用 image 启动容器,更新后提交结果到新的 image 。
[root@localhost ~]# docker run -dit centos:latest
-d:后台运行容器,并返回容器ID
-i:交互模式运行容器,通常与-t同时使用;相当于在本地添加了一个系统
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
centos:latest:使用哪个容器:标签
进入容器:
docker exec -it [NAME|ID...] /bin/bash
[root@112013888a97 /]# yum -y install mariadb-server //在新容器中mariadb
[root@112013888a97 /]# exit //退出容器
docker commit -a "liangxi" -m "add mariadb app" 112013888a97 centos:mariadb
sha256:e2c503de036a2c788b550f0256e00913435e90433fea2768527bda4acf435f99
docker commit:提交相应的副本
-a "fengyongqi" :作者信息
-m "add mariadb app" :描述
112013888a97 :源容器ID
centos:mariadb:new容器名称:tag
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos mariadb e2c503de036a 12 minutes ago 211MB
之后就可以使用新的镜像来启动容器
查看本机运行的容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器ID 使用的镜像 启动容器时运行的命令 创建容器的时间 容器状态 容器的端口信息 自动分配的容器名称
【删除本地所有的容器】
docker rm -f `docker ps -a`
方法2:从dockerfile来创建image
docker file 构建镜像常用指令
FROM:
FROM <镜像名字>
FROM <镜像名字>:<镜像标签>
FROM <镜像名字>:<标签信息>
意为指定基础镜像,三种写法,其中<标签>,<标签信息>是可选项,如果没有写,为默认值“latest”
from大小写都可以,但是建议大写
RUN:
构建时执行的动作
shell格式:RUN < command >
exec格式:RUN ["可执行文件", "参数1", "参数2"]
例:
[
FROM centos7:7
RUN ["/bin/bash","-c","echo hello"]
RUN ["/bin/bash","-c","echo hello"]
[
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos7:7
---> 2dba1aa4d081
Step 2/2 : RUN ["/bin/bash","-c","echo hello"]
---> Running in 5d87e08286f8
hello
Removing intermediate container 5d87e08286f8
---> 8b164c04a181
Successfully built 8b164c04a181
Successfully tagged test:t1
COPY:
复制当前宿主目录下的文件到容器内
格式:
COPY [--chown=<user>:<group>] <源路径>... <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
例:
[
FROM centos7:7
copy 123 /tmp
[
Sending build context to Docker daemon 2.56kB
Step 1/2 : FROM centos7:7
---> 2dba1aa4d081
Step 2/2 : COPY 123 /tmp
---> d01e283e3282
Successfully built d01e283e3282
Successfully tagged test2:2
[
[
123 ks-script-DrRL8A yum.log
EXPOSE
暴露某个端口,相当于防火墙放行端口(默认为tcp)
格式:
EXPOSE <端口1> [<端口2>...]
例
[
FROM centos7:7
EXPOSE 8080
[
Sending build context to Docker daemon 2.56kB
Step 1/2 : FROM centos7:7
---> 2dba1aa4d081
Step 2/2 : EXPOSE 8080
---> Running in 74cf21eb6b8a
Removing intermediate container 74cf21eb6b8a
---> 48e8eafd3cd5
Successfully built 48e8eafd3cd5
Successfully tagged test6:6
[
465bced6927af9065bfc0a300fdee307a27cadc8019315cd194d83a3dd45676b
[
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
465bced6927a test6:6 "/bin/bash" 4 seconds ago Up 3 seconds 8080/tcp crazy_satoshi
WORKDIR
切换目录,类似于linux中的CD命令,如果目录不存在,会创建这个目录
格式:
WORKDIR path
例
FROM centos7:7
WORKDIR /234
WORKDIR 345/
Sending build context to Docker daemon 2.56kB
Step 1/3 : FROM centos7:7
Step 2/3 : WORKDIR /234
Step 3/3 : WORKDIR 345/
Removing intermediate container 1dcdd6514ea6
Successfully built c8de9b28b0f1
Successfully tagged test7:7
/234/345
VOLUME
VOLUME用来创建一个可以从本地主机或其他容器挂载的挂载点。
格式:
VOLUME ["path"]
例:
FROM centos:latest
VOLUME /data
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos:latest
Step 2/2 : VOLUME /data
Removing intermediate container 13156955e42a
Successfully built ae1c48ffe2f5
Successfully tagged centos:latest
docker inspect ae1c48ffe2f5
},
#当容器启动后默认存放在/var/lib/docker/volumes/"容器ID"/挂载目录
USER
USER命令用于指定当前望下执行的用户,需要注意的是这个用户必须是已经存在,否则无法指定。它的用法和WORKDIR有点像,切换用户。
格式:
ADD
类似于scp但是不需要输入账号密码(如果是压缩包会解压)url不会解压
格式:
ADD [--chown=<user>:<group>] <源路径>... <目标路径>
ADD [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
例:
[
FROM centos7:7
ADD nginx-1.18.0.tar.gz /tmp
[
Sending build context to Docker daemon 1.043MB
Step 1/2 : FROM centos7:7
---> 2dba1aa4d081
Step 2/2 : ADD nginx-1.18.0.tar.gz /tmp
---> 15f7a0fbaa6a
Successfully built 15f7a0fbaa6a
Successfully tagged test8:8
[
[
ks-script-DrRL8A nginx-1.18.0 yum.log
ONBUILD
ONBUILD用于配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
格式:
ONBUILD
例:
CMDDockerfile
FROM ubuntu
ONBUILD RUN echo "This is an example ONBUILD instruction"
Dockerfile
FROM custom-base-image
ONBUILD 指令通常用于包装常见的构建需求,例如在构建上级镜像时执行一些共享的构建步骤。通过使用 ONBUILD,您可以将这些共享的指令封装到基础镜像中,在派生镜像的构建过程中自动执行,从而简化和标准化构建流程。
容器启动时执行的操作执行完成后容器死亡,倘若有多条,只输出最后一条
格式:
shell 格式:CMD <命令>
exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
例:
[
FROM centos7:7
CMD echo "123"
[
Sending build context to Docker daemon 2.56kB
Step 1/2 : FROM centos7:7
---> 2dba1aa4d081
Step 2/2 : CMD echo "123"
---> Running in adb9a4237ebc
Removing intermediate container adb9a4237ebc
---> 8990193dac76
Successfully built 8990193dac76
Successfully tagged test3:3
[
123
ENTRYPOINT(可以于CMD共存)
作用和用法与CMD一样,但是ENTRYPOINT有和CMD有2处不一样:
CMD的命令会被docker run的命令覆盖而ENTRYPOINT不会
CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且此CMD提供的参数会被 docker run 后面的命令覆盖
maintainer
指定作者(即将废弃,建议使用label)
格式:
MAINTAINER <name> <email>
例:
[root@localhost dockerfile]# cat dockerfile
FROM centos7:7
maintainer hhq 123@qq.com
[root@localhost dockerfile]# docker build -t test4:4 .
Sending build context to Docker daemon 2.56kB
Step 1/2 : FROM centos7:7
---> 2dba1aa4d081
Step 2/2 : maintainer hhq 123@qq.com
---> Running in cd75bed15a31
Removing intermediate container cd75bed15a31
---> 9e71974e55a7
Successfully built 9e71974e55a7
Successfully tagged test4:4
[root@localhost dockerfile]# docker inspect -f "{{.Author}}" test4:4
hhq 123@qq.com
ENV
ENV命名用于设置容器的环境变量,这些变量以”key=value”的形式存在,在容器内被脚本或者程序调用,容器运行的时候这个变量也会保留。
格式:
设置一个:ENV <key> <value>
设置多个:ENV <key1>=<value1> <key2>=<value2>...
例:
[root@localhost dockerfile]# cat dockerfile
FROM centos7:7
RUN echo 123
ENV t1=1
RUN echo $t1
ENV t2=2 t3=3
RUN echo $t2 $t3
[root@localhost dockerfile]# docker build -t test10:10 . --no-cache
Sending build context to Docker daemon 1.043MB
Step 1/6 : FROM centos7:7
---> 2dba1aa4d081
Step 2/6 : RUN echo 123
---> Running in 5dfdd9a7ee1a
123
Removing intermediate container 5dfdd9a7ee1a
---> 2f83414bbb26
Step 3/6 : ENV t1=1
---> Running in 4bff686d41d8
Removing intermediate container 4bff686d41d8
---> 2eeee756123b
Step 4/6 : RUN echo $t1
---> Running in 4de0aad46fbf
1
Removing intermediate container 4de0aad46fbf
---> 7344007c9db9
Step 5/6 : ENV t2=2 t3=3
---> Running in 9e3be039011c
Removing intermediate container 9e3be039011c
---> 96a156b34ace
Step 6/6 : RUN echo $t2 $t3
---> Running in 334a5f03d4fb
2 3
Removing intermediate container 334a5f03d4fb
---> d5abfc8bedbe
五、从本地文件系统导入导出镜像
存出和载入镜像
[
[
[
[
或
[
六、容器的基本操作
新建并启动容器
例:使用镜像centos:latest以交互模式启动一个容器,在容器内执行/bin/bash命令
[root@localhost ~]# docker run -it --name feng centos:latest /bin/bash
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name:为容器添加个名字
这个时候如果正常退出(logout、exit、Ctrl+C),查看容器处于Exited退出状态
如果想要正常退出并且使容器还在运行状态使用(Ctrl+p+q)回车即可退出伪终端
*********************************************************************
[root@localhost ~]# docker run centos:latest /bin/echo "hello world"
上面命令输出一个“hello world",之后终止容器
********************************************************************
使用Docker run来创建容器时,Docker在后台运行的标准操作
⑴.检查本地是否存在指定的镜像,不存在就从公有仓库下载
⑵.利用镜像创建并启动一个容器
⑶.分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
⑷.从宿主机配置的网桥接口中桥接一个虚拟接口道容器中去
⑸.从地址池配置一个ip地址给容器
⑹.执行用户指定的应用程序
⑺.执行完毕后容器被终止
查看容器
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
容器ID 使用的镜像 启动容器时运行的命令 容器创建时间 容器状态 端口信息 自动分配的容器名称
-a :显示所有的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近创建的容器。
-n :列出最近创建的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
*******************************************************
容器状态有七种
状态有7种:
created(已创建)、restarting(重启中)、running(运行中)、removing(迁移中)
paused(暂停)、exited(停止)、dead(死亡)
容器的启动关闭
[
[
[
强制终止容器
[
守护态形式(Daemonized)运行
需要让Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下
[root@localhost ~]# docker run -d centos:latest /bin/bash -c "while true;do echo hello world;sleep 1;done"
/bin/bash -c... 是在容器内部运行的命令,因为是个循环脚本,所以说知道这个脚本没有结束,这个容器就不会终止
用docker inspect 查看容器信息
[
用docker inspect 查看容器IP地址
[
进入容器
在使用 -d 参数时,容器启动后会进入后台。此时想要进入容器,可以通过以下指令进入
docker attach [容器ID/容器name]
docker exec [容器ID/容器name]
推荐使用 docker exec 命令,因为它是从新打开一个新的伪终端,所以退出后新的伪终端会终止,但是原来的不会终止
[root@localhost ~]# docker attach [容器ID/容器name]
或
[root@localhost ~]# docker exec -it [容器ID/容器name] /bin/bash
使用nsenter进入容器
[root@localhost ~]# rpm -qf /usr/bin/nsenter 查看nsenter工具包是否存在
util-linux-2.23.2-33.el7.x86_64
********************************************************************
安装nsenter工具在util-linux2.23版本后包含,如果没有util-linux包没有该命令,按照下面方法安装
[root@localhost ~]# wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
[root@localhost ~]# tar zxf util-linux-2.24.tar.gz
[root@localhost ~]# cd util-linux-2.24/
[root@localhost util-linux-2.24]# ./configure --without-ncurses && make nsenter
[root@localhost util-linux-2.24]# cp nsenter /usr/local/bin/
*****************************************************************
为了连接到容器,还需要找到容器的第一个进程的PID
[root@localhost /]# docker inspect --format "{{.State.Pid}}" d9f90f8b45bb
17316
通过PID连接到这个容器
[root@localhost /]# nsenter --target 17316 -i -p -u -m -n
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
**********************************************************************************************
【更简单的,下载.bashrc_docker,并将内容放到.bashrc中】
[root@localhost ~]# vim /root/.bashrc
脚本内容可在下列网址中复制粘贴追加到.bashrc中
https://github.com/dzckzeo/bashrc_docker/blob/f586c5f3d27f46d9c915e7c379525b3bac77d156/.bashrc_docker
[root@localhost ~]# source /root/.bashrc //刷新文件
这个文件中定义了很多方便的docker的命令,例如docker-pid可以获取某个容器的pid
而docker-enter可以进入容器或直接在容器内执行命令
[root@localhost ~]# docker-pid [容器ID/容器name]
[root@localhost ~]# docker-enter [容器ID/容器name]
删除容器
[
[
【同时删除多个筛选条件的容器】
例:删除状态为终止的容器
[
docker container ls:列出所有容器
-f:根据提供的条件过滤输出
status=exited:条件;status=终止状态
-q:显示容器ID
【删除所有的容器】删除终止状态中的容器
[
或
[
七、容器的导入导出
Usage: docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
有三种方法可以导入
1)导入本地文件 file 2)导入URL远程的包 URL 3)标准输入输出 -
支持压缩包 (.tar, .tar.gz, .tgz, .bzip, .tar.xz, or .txz)
*****************************************************************
Usage: docker export [OPTIONS] CONTAINER
1、导入导出本地文件file
[root
[root
[root
[root
2、导入URL远程的包的URL
[
//docker import URL可在上面链接openvz模板中复制下载地址 镜像名:tag
[
3、标准输入输出
(可以用openvz模板中的包下载到本地然后导入)
[
sha256:82670c36c4911819655400f6aeac8ebd4275e9e03a37e963915ca87b53b1294b
[