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.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             SIZE来自于哪个仓库        tag标签              镜像ID号             创建时间           镜像的大小sizebase 镜像有两层含义: 1. 不依赖其他镜像,从 scratch 构建。 2. 其他镜像可以以它为基础进行扩展。 所以,能称作base镜像的通常都是各种 Linux 发行版的 Docker 镜 像,比如 Ubuntu, Debian, CentOS 等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:mariadb    sha256:e2c503de036a2c788b550f0256e00913435e90433fea2768527bda4acf435f99                docker commit:提交相应的副本                -a "fengyongqi" :作者信息                -m "add mariadb app" :描述                112013888a97 :源容器ID                centos: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"]

例:

[root@localhost dockerfile]# cat dockerfile FROM centos7:7RUN ["/bin/bash","-c","echo hello"]
RUN ["/bin/bash","-c","echo hello"][root@localhost dockerfile]# docker build -t test:t1 . --no-cacheSending 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>",... "<目标路径>"]

例:

[root@localhost dockerfile]# cat dockerfile FROM centos7:7copy 123 /tmp
[root@localhost dockerfile]# docker build -t test2:2 .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
[root@73433ba27390 /]# cd /tmp[root@73433ba27390 tmp]# ls123 ks-script-DrRL8A yum.log

EXPOSE

暴露某个端口,相当于防火墙放行端口(默认为tcp) 

格式:

EXPOSE <端口1> [<端口2>...]

[root@localhost dockerfile]# cat dockerfile FROM centos7:7EXPOSE 8080
[root@localhost dockerfile]# docker build -t test6:6 .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
[root@localhost dockerfile]# docker run -dit test6:6 /bin/bash465bced6927af9065bfc0a300fdee307a27cadc8019315cd194d83a3dd45676b
[root@localhost dockerfile]# docker ps 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

[root@localhost dockerfile]# cat dockerfile FROM centos7:7WORKDIR /234WORKDIR 345/
[root@localhost dockerfile]# docker build -t test7:7 .Sending build context to Docker daemon 2.56kBStep 1/3 : FROM centos7:7 ---> 2dba1aa4d081Step 2/3 : WORKDIR /234 ---> Using cache ---> f6c3deb6a95dStep 3/3 : WORKDIR 345/ ---> Running in 1dcdd6514ea6Removing intermediate container 1dcdd6514ea6 ---> c8de9b28b0f1Successfully built c8de9b28b0f1Successfully tagged test7:7
[root@localhost dockerfile]# docker run -it test7:7 /bin/bash[root@b62bb896d84f 345]# pwd/234/345

VOLUME

VOLUME用来创建一个可以从本地主机或其他容器挂载的挂载点。 

格式:

VOLUME ["path"]

例:

[root@localhost dockerfile]# cat dockerfile FROM centos:latestVOLUME /data
[root@localhost dockerfile]# cat dockerfile | docker build -t centos:latest -Sending build context to Docker daemon 2.048kBStep 1/2 : FROM centos:latest ---> 5d0da3dc9764Step 2/2 : VOLUME /data ---> Running in 13156955e42aRemoving intermediate container 13156955e42a ---> ae1c48ffe2f5Successfully built ae1c48ffe2f5Successfully tagged centos:latestdocker inspect ae1c48ffe2f5 "Volumes": { "/data": {} },
#当容器启动后默认存放在/var/lib/docker/volumes/"容器ID"/挂载目录

USER

USER命令用于指定当前望下执行的用户,需要注意的是这个用户必须是已经存在,否则无法指定。它的用法和WORKDIR有点像,切换用户。

格式:

user  用户名

ADD

类似于scp但是不需要输入账号密码(如果是压缩包会解压)url不会解压

格式:

ADD [--chown=<user>:<group>] <源路径>... <目标路径>ADD [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]

例:

[root@localhost dockerfile]# cat dockerfile FROM centos7:7ADD nginx-1.18.0.tar.gz /tmp
[root@localhost dockerfile]# docker build -t test8:8 .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
[root@localhost dockerfile]# docker run -it test8:8 /bin/bash[root@20231b9413a9 /]# ls /tmp/ks-script-DrRL8A nginx-1.18.0 yum.log

ONBUILD

ONBUILD用于配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

格式:

ONBUILD [命令]

例:

DockerfileFROM ubuntuONBUILD RUN echo "This is an example ONBUILD instruction"如果您将上述 Dockerfile 用作基础镜像构建新的镜像,如下所示:
DockerfileFROM custom-base-image在构建最终的镜像时,ONBUILD 中的指令将会自动触发并执行。
ONBUILD 指令通常用于包装常见的构建需求,例如在构建上级镜像时执行一些共享的构建步骤。通过使用 ONBUILD,您可以将这些共享的指令封装到基础镜像中,在派生镜像的构建过程中自动执行,从而简化和标准化构建流程。
请注意,ONBUILD 指令在 Docker 17.06 版本后被列为过时功能。因此,建议避免使用 ONBUILD 指令的新项目,并寻找其他更现代化的构建流程解决方案。
CMD

容器启动时执行的操作执行完成后容器死亡,倘若有多条,只输出最后一条

格式:

shell 格式:CMD <命令>exec 格式:CMD ["可执行文件", "参数1", "参数2"...]

 

例:

[root@localhost dockerfile]# cat dockerfile FROM centos7:7CMD echo "123"
[root@localhost dockerfile]# docker build -t test3:3 . --no-cacheSending 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
[root@localhost dockerfile]# docker run -it test3:3123

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: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 dockerfile FROM 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

五、从本地文件系统导入导出镜像

存出和载入镜像

[root@localhost ~]# docker images[root@localhost ~]# docker save -o /tmp/mysql_image.tar mysql:5.7    //存出镜像到本地文件[root@localhost ~]# docker rmi mysql:5.7   //将源镜像删除,否则导入的镜像只会覆盖[root@localhost ~]# docker load --input /tmp/mysql_image.tar //从导出的本地文件中导入到本地镜像库[root@localhost ~]# docker load < /tmp/mysql_image.tar  //--input和 < 效果一样

六、容器的基本操作

新建并启动容器

例:使用镜像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(死亡)

容器的启动关闭

[root@localhost ~]# docker start [容器ID/容器名字][root@localhost ~]# docker stop [容器ID/容器名字][root@localhost ~]# docker restart [容器ID/容器名字]强制终止容器[root@localhost ~]# docker kill [容器ID/容器名字]

守护态形式(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 查看容器信息

[root@localhost ~]# docker inspect [容器ID/容器名称]

用docker inspect 查看容器IP地址

[root@localhost ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [容器ID/容器name]

进入容器

在使用 -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]

删除容器

[root@localhost ~]# docker rm [容器ID/容器name]    //删除终止的容器[root@localhost ~]# docker rm -f  [容器ID/容器name]  //可强制删除运行中的容器【同时删除多个筛选条件的容器】例:删除状态为终止的容器[root@localhost ~]# docker rm `docker container ls -f "status=exited" -q`               docker container ls:列出所有容器               -f:根据提供的条件过滤输出               status=exited:条件;status=终止状态               -q:显示容器ID【删除所有的容器】删除终止状态中的容器[root@localhost ~]# docker rm `docker ps -aq`[root@localhost ~]# docker rm $(docker ps -aq)

七、容器的导入导出

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@localhost ~]# docker ps -a[root@localhost ~]# docker export 容器ID或容器名 > /tmp/Mycentos-export.tar   //将某个容器导出为一个文件 [root@localhost ~]# docker import  /tmp/Mycentos-export.tar  import:file    //将导出的文见导入为镜像,记得修改镜像名个标签[root@localhost ~]# docker images  //查看可见生成 一个新的镜像

2、导入URL远程的包的URL

[root@localhost ~]# docker import http://download.openvz.org/template/precreated/debian-7.0-x86_64-minimal.tar.gz centos:URLcentos//docker  import  URL可在上面链接openvz模板中复制下载地址  镜像名:tag[root@localhost ~]# docker images

3、标准输入输出

(可以用openvz模板中的包下载到本地然后导入)[root@localhost ~]# cat /tmp/centos-6-x86_64.tar.gz | docker import - centos6:importsha256:82670c36c4911819655400f6aeac8ebd4275e9e03a37e963915ca87b53b1294b[root@localhost ~]# docker images
收录于合集 #docker
 2
下一篇docker私有仓库的搭建与使用
阅读 537
凉兮的运维日记
22篇原创内容
 
 
posted @ 2023-07-13 17:19  往事已成昨天  阅读(44)  评论(0编辑  收藏  举报