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.reposed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo#快速更新本地软件包缓存yum makecache fast#更新并安装Docker-CEyum -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#启动dockersystemctl 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-reloadsystemctl restart docker
四、镜像的基本操作
显示本机上的镜像
docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbase 镜像有两层含义:docker images --no-trunc //完整版image IDdocker images -q //只显示IDdocker rmi //删除镜像
查找镜像(images)获取某个仓库中的镜像
docker search centosNAME DESCRIPTION STARS OFFICIAL AUTOMATEDimage名字 描述 星级(表示该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:mariadbsha256:e2c503de036a2c788b550f0256e00913435e90433fea2768527bda4acf435f99docker commit:提交相应的副本-a "fengyongqi" :作者信息-m "add mariadb app" :描述112013888a97 :源容器IDcentos:mariadb:new容器名称:tag[root@localhost ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos mariadb e2c503de036a 12 minutes ago 211MB之后就可以使用新的镜像来启动容器
查看本机运行的容器
docker ps -aCONTAINER 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:7RUN ["/bin/bash","-c","echo hello"]RUN ["/bin/bash","-c","echo hello"][Sending build context to Docker daemon 2.048kBStep 1/2 : FROM centos7:7---> 2dba1aa4d081Step 2/2 : RUN ["/bin/bash","-c","echo hello"]---> Running in 5d87e08286f8helloRemoving intermediate container 5d87e08286f8---> 8b164c04a181Successfully built 8b164c04a181Successfully tagged test:t1
COPY:
复制当前宿主目录下的文件到容器内
格式:
COPY [--chown=<user>:<group>] <源路径>... <目标路径>COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
例:
[FROM centos7:7copy 123 /tmp[Sending build context to Docker daemon 2.56kBStep 1/2 : FROM centos7:7---> 2dba1aa4d081Step 2/2 : COPY 123 /tmp---> d01e283e3282Successfully built d01e283e3282Successfully tagged test2:2[[123 ks-script-DrRL8A yum.log
EXPOSE
暴露某个端口,相当于防火墙放行端口(默认为tcp)
格式:
EXPOSE <端口1> [<端口2>...]
例
[FROM centos7:7EXPOSE 8080[Sending build context to Docker daemon 2.56kBStep 1/2 : FROM centos7:7---> 2dba1aa4d081Step 2/2 : EXPOSE 8080---> Running in 74cf21eb6b8aRemoving intermediate container 74cf21eb6b8a---> 48e8eafd3cd5Successfully built 48e8eafd3cd5Successfully tagged test6:6[465bced6927af9065bfc0a300fdee307a27cadc8019315cd194d83a3dd45676b[CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES465bced6927a test6:6 "/bin/bash" 4 seconds ago Up 3 seconds 8080/tcp crazy_satoshi
WORKDIR
切换目录,类似于linux中的CD命令,如果目录不存在,会创建这个目录
格式:
WORKDIR path
例
FROM centos7:7WORKDIR /234WORKDIR 345/Sending build context to Docker daemon 2.56kBStep 1/3 : FROM centos7:7Step 2/3 : WORKDIR /234Step 3/3 : WORKDIR 345/Removing intermediate container 1dcdd6514ea6Successfully built c8de9b28b0f1Successfully tagged test7:7/234/345
VOLUME
VOLUME用来创建一个可以从本地主机或其他容器挂载的挂载点。
格式:
VOLUME ["path"]
例:
FROM centos:latestVOLUME /dataSending build context to Docker daemon 2.048kBStep 1/2 : FROM centos:latestStep 2/2 : VOLUME /dataRemoving intermediate container 13156955e42aSuccessfully built ae1c48ffe2f5Successfully tagged centos:latestdocker inspect ae1c48ffe2f5},#当容器启动后默认存放在/var/lib/docker/volumes/"容器ID"/挂载目录
USER
USER命令用于指定当前望下执行的用户,需要注意的是这个用户必须是已经存在,否则无法指定。它的用法和WORKDIR有点像,切换用户。
格式:
ADD
类似于scp但是不需要输入账号密码(如果是压缩包会解压)url不会解压
格式:
ADD [--chown=<user>:<group>] <源路径>... <目标路径>ADD [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
例:
[FROM centos7:7ADD nginx-1.18.0.tar.gz /tmp[Sending build context to Docker daemon 1.043MBStep 1/2 : FROM centos7:7---> 2dba1aa4d081Step 2/2 : ADD nginx-1.18.0.tar.gz /tmp---> 15f7a0fbaa6aSuccessfully built 15f7a0fbaa6aSuccessfully tagged test8:8[[ks-script-DrRL8A nginx-1.18.0 yum.log
ONBUILD
ONBUILD用于配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
格式:
ONBUILD
例:
CMDDockerfileFROM ubuntuONBUILD RUN echo "This is an example ONBUILD instruction"DockerfileFROM custom-base-imageONBUILD 指令通常用于包装常见的构建需求,例如在构建上级镜像时执行一些共享的构建步骤。通过使用 ONBUILD,您可以将这些共享的指令封装到基础镜像中,在派生镜像的构建过程中自动执行,从而简化和标准化构建流程。
容器启动时执行的操作执行完成后容器死亡,倘若有多条,只输出最后一条
格式:
shell 格式:CMD <命令>exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
例:
[FROM centos7:7CMD echo "123"[Sending build context to Docker daemon 2.56kBStep 1/2 : FROM centos7:7---> 2dba1aa4d081Step 2/2 : CMD echo "123"---> Running in adb9a4237ebcRemoving intermediate container adb9a4237ebc---> 8990193dac76Successfully built 8990193dac76Successfully 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 dockerfileFROM centos7:7maintainer hhq 123@qq.com[root@localhost dockerfile]# docker build -t test4:4 .Sending build context to Docker daemon 2.56kBStep 1/2 : FROM centos7:7---> 2dba1aa4d081Step 2/2 : maintainer hhq 123@qq.com---> Running in cd75bed15a31Removing intermediate container cd75bed15a31---> 9e71974e55a7Successfully built 9e71974e55a7Successfully tagged test4:4[root@localhost dockerfile]# docker inspect -f "{{.Author}}" test4:4hhq 123@qq.com
ENV
ENV命名用于设置容器的环境变量,这些变量以”key=value”的形式存在,在容器内被脚本或者程序调用,容器运行的时候这个变量也会保留。
格式:
设置一个:ENV <key> <value>设置多个:ENV <key1>=<value1> <key2>=<value2>...
例:
[root@localhost dockerfile]# cat dockerfileFROM centos7:7RUN echo 123ENV t1=1RUN echo $t1ENV t2=2 t3=3RUN echo $t2 $t3[root@localhost dockerfile]# docker build -t test10:10 . --no-cacheSending build context to Docker daemon 1.043MBStep 1/6 : FROM centos7:7---> 2dba1aa4d081Step 2/6 : RUN echo 123---> Running in 5dfdd9a7ee1a123Removing intermediate container 5dfdd9a7ee1a---> 2f83414bbb26Step 3/6 : ENV t1=1---> Running in 4bff686d41d8Removing intermediate container 4bff686d41d8---> 2eeee756123bStep 4/6 : RUN echo $t1---> Running in 4de0aad46fbf1Removing intermediate container 4de0aad46fbf---> 7344007c9db9Step 5/6 : ENV t2=2 t3=3---> Running in 9e3be039011cRemoving intermediate container 9e3be039011c---> 96a156b34aceStep 6/6 : RUN echo $t2 $t3---> Running in 334a5f03d4fb2 3Removing 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 -aCONTAINER 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}}" d9f90f8b45bb17316通过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[