什么是docker?

docker是一门容器虚拟化的技术,用于管理软件部署的应用。windows下部署docker需要借助于windows的hype-v技术,先虚拟化出一个虚拟机来。

下载地址

对于win10及以上的机器直接安装docker for windows即可。

https://www.docker.com/products/docker-desktop

对于一些老的windows系统则需要安装docker toolbox工具。

http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
https://github.com/boot2docker/boot2docker

docker的好处

  • 软件+环境一起打包,能够避免因环境不一致而出现地各种问题,大大提高软件地部署效率。
  • 一次构建,到处运行。
  • 更简单的系统运维,更便捷的升级和扩容缩。
  • 更高效的计算资源利用。

docker与虚拟机的对比

虚拟机技术

  • 传统的虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程。
  • 相对于容器技术来说,虚拟机技术消耗的系统资源更多,启动更慢。

容器技术

  • 而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
  • 每个容器之间相互隔离,每个容器都有自己所需的库和文件配置。

docker目录结构

windows查看镜像存储位置

打开docker desktop,在settings->Resources->ADVANCED 中,可以查看到镜像的存储位置。

windows修改镜像存储地址

将存储位置的文件 移动到 指定位置,然后在 docker desktop中将镜像位置指向新地址,然后重启docker desktop。

修改远程仓库地址

  1. {
  2. "registry-mirrors": [
  3. "https://9y7pen75.mirror.aliyuncs.com"
  4. ],
  5. "insecure-registries": [],
  6. "debug": true,
  7. "experimental": false
  8. }

linux修改镜像存储地址

cat /etc/docker/daemon.json

{
  "registry-mirrors": ["https://9y7pen75.mirror.aliyuncs.com"]
}

docker常用命令

查看版本信息

docker -v

查看docker命令帮助

docker run --help

运行容器

#交互式启动一个镜像,如果本地镜像不存在,则会拉取最新的远程镜像
docker run -id image_id --name name -p 80:80 bin/bash

#后台运行一个镜像
docker run -d image_id

-w,替换工作目录
-P,随机映射本地端口到容器中开放的端口
-u,指定远程用户
-v,挂载容器卷
--memory,内存限制
--cpus=2,cpu核数限制

附加本地的标准输入流和输出流,错误流到运行的容器

docker attach container_id

进入运行的容器

docker exec -it container_id bin/bash

监控容器

docker stats container_id

拷贝文件

宿主机 和 本地文件系统之间 进行文件拷贝。

#将容器路径拷贝到本地
docker cp CONTAINER:SRC_PATH DEST_PATH

#将本地路径拷贝到容器路径
docker cp SRC_PATH CONTAINER:DEST_PATH

查看容器运行记录

docker logs container_id

查看容器运行进程

docker top container_id

查看容器配置信息

docker inspect container_id

退出容器

#对于没有前台运行进程的容器来说

exit,退出并关闭
ctrl+p+q,退出不关闭

images镜像

docker镜像,分为基础镜像 和 只读镜像。这时候,如果对文件系统进行修改时,会在最上面添加一个读写层,将使用到的只读文件拷贝到读写层。

查找镜像

docker search jenkins

拉取镜像

docker pull image_id

列出本地镜像

#REPOSITORY  TAG IMAGE ID CREATED SIZE
#仓库 标签/版本号 镜像名称 镜像id 创建时间 大小

docker images

docker rmi image_id

构建镜像

构建镜像的方式由俩种,一种是基于现有容器进行提交,另外一种是基于build dockerfile的方式。镜像的构建存在缓存,也就是说当某一步构建失败的时候,再次进行构建时,直接从构建失败的前一步开始。如果不需要构建缓存,那么可以手动修改一个变量的值,让构建缓存失效。

#提交修改
docker commit contain_id images_name:version

使用Dokcerfile构建镜像。Dockerfile由一系列指令组成,命令关键字都为大写,注释使用#。

Dockerfile指令:

#在镜像即将启动时执行的命令,可以被docker run指定的命令覆盖。
CMD

#固定需要执行的命令,docker run后面执行的参数会传递给ENTRYPOINT指令的命令。
ENTRYPOINT

#指定工作目录
WORKDIR

#添加环境变量
ENV

#以什么样的用户去运行镜像
USER

#用于向基于镜像创建的容器添加卷
#卷可以在容器间共享和重用
#对于卷的修改是立即生效的
#对于卷的修改不会对更新镜像产生影响
#卷会一直存在到没有任何容器再使用它。
VOLUMN

#添加构建目录中的本地文件到镜像中,对于压缩文件会进行解压
ADD

#拷贝命令
COPY

#触发器命令,会在镜像被当作基础镜像构建时,执行相应的指令。
ONBUILD

docker镜像示例:

#基于debian创建一个镜像。
FROM debian

#添加维护者信息
MAINTAINER chenhao "coderchenhao@163.com"

#替换为国内镜像源
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN sed -i 's/security.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

#RUN指令,会在镜像构建过程中运行相应的命令。
RUN apt-get update
RUN apt-get install -y nginx

#暴露端口,需要在镜像时进行端口映射
EXPOSE 80

写好了Dockerfile之后,可以在当前目录使用dokcer build命令,来运行 Dockerfile 创建镜像。每运行一个指令,都会添加一层镜像。

#在当前目录查找Dockerfile文件制作镜像
#最后面的那个.代表的是 当前目录
docker build -t "仓库名/镜像名:标签名" .

创建完镜像之后,我们需要运行镜像,并且需要让nginx以前台方式运行,nginx以后台方式运行的话,容器会退出。

docker run -d -p 80:80 --name nginx-dev chenhao/nginx:1.0.0 /usr/sbin/nginx -g "daemon off;"

这里我们也可以修改Dockerfile文件,添加镜像启动时的可选命令。

CMD nginx -g "daemon off;"

查看镜像构建过程

docker history image_id

上传到远程仓库

#重新创建一个image_name的镜像
docker tag image_id image_name

#推送镜像到默认的远程仓库
docker push image_name

#登陆远程仓库
docker login --username=your_name repository_url:tag

container容器

提交容器修改

docker commit contain_id images_name:version

容器之间共享文件

容器之间交互可以通过数据卷的方式,主要有俩种方式。第一种方式,在容器启动的时候,挂载本地数据卷 到 容器卷。

docker run -it -v e:\data:/project/data 831691599b88 bin/bash

第二种方式:在使用Dockerfile的时候,使用VOLUME指令指定共享目录。运行这个容器A的时候,宿主机会随机生成一个目录 用于容器之间的数据交互。并且其它容器B只有指定了 —volumes—from选项,才可以跟这个容器A进行数据的交互。

#Dockerfile文件

#基于debian创建一个镜像。
FROM debian

#添加维护者信息
MAINTAINER chenhao "coderchenhao@163.com"

#挂载容器卷
VOLUME ["/opt/project", "data"]
#运行容器A
docker run -it --name debian-1 chenhao/debian:1.0.0 bin/bash

#运行容器B
docker run -it --name debian-3 --volumes-from debian-1 chenhao/debian:1.0.0 bin/bash

容器之间通信

容器之间交互可以通过tcp/ip协议进行网络通信,主要有俩种方式。第一种方式,在容器启动的时候,使用dokcer容器之间的局域网。

#查看docker容器之间的内网地址,在NetworkSettings中可以看到信息。
docker inspect container_id

#使用ping命令,进行网络连接测试
ping ip:port

第二种则适用于容器绑定了宿主机的端口,这时候可以使用宿主机的内网地址或者公网地址 进行容器之间的通信。

#如使用curl工具,在容器中测试,是否能访问到jenkins镜像的web地址192.168.3.33:8080
curl 192.168.3.33:8080

设置容器自启动

docker容器自启动的方式有俩种,第一种是在初次运行容器的时候,就指定参数。

docker run -d -v d:

第二种,使用docker update语句修改配置。

docker update --restart=always nexus3

第三种,手动修改容器的hsotconfig文件。

  1. 先停止docker服务

    systemctl stop docker
    
  2. 修改配置对应容器的hostconfig配置

    "RestartPolicy": {
         "Name": "always",
         "MaximumRetryCount": 0
    }
    

    给运行容器追加端口

  3. 先停止docker服务

    systemctl stop docker
    
  4. 修改对应容器的配置 ```shell cd /var/lib/docker/containers/container_id

在有关port的配置中,新增端口信息

vim config.v2.json

在有关port的配置中,新增端口信息

vim hostconfig.json


<a name="aV22W"></a>
### repository仓库

仓库由一系列相同性质,不同标签的镜像组成。

<a name="gHyOS"></a>
#### 顶层仓库

顶层仓库只有一层目录,也就是对应的官方镜像。

<a name="9d471d4c"></a>
#### 用户仓库

用户仓库分为俩层目录。

<a name="sh8W4"></a>
### 搭建私有仓库

搭建私有仓库的过程也非常简单,只需要从dockerhub上面拉取镜像运行即可。推送的过程,跟之前的上传到远程镜像类似。

```shell
docker run -p 5000:5000 registry

通过远程api管理docker容器

开启远程访问

将dokcer守护进程绑定到网络接口

ExecStart=/usr/bin/docker -d --selinux-enabled -H tcp://0.0.0.0:2375

镜像接口

获取镜像:

$ curl http://docker.example.com:2375/images/json

容器接口

#列出正在运行的容器
containers/json

#列出所有的容器
containers/json?all=1

#创建容器
containers/create?name=jekyll

#启动容器
containers/container_id/start

给docker配置镜像源

#编辑守护进程的配置
vi /etc/docker/daemon.json

#修改docker镜像中心的地址,这里用的是自己的专属镜像加载地址
{
      "registry-mirrors": ["https://9y7pen75.mirror.aliyuncs.com"]
}

给docker绑定本地端口(开启远程访问)

在windows环境下面,勾选docker desktop下面的Settings->General的Expose daemon on tcp://localhost:2375 without TLS 选项。

#通付连接docker查看端口是否启用成功
docker -H 127.0.0.1:2375 info

在linux环境下面,需要修改docker.service文件。修改完之后,重启docker服务。

find / -name 'docker.service'

ExecStart-/usr/bin/docker -d --selinux-enabled

#需要使用daemon-reload重载服务的配置,然后再重启对应服务
systemctl daemon-reload

service docker restart

给docker配置授权认证