什么是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。
修改远程仓库地址
{
"registry-mirrors": [
"https://9y7pen75.mirror.aliyuncs.com"
],
"insecure-registries": [],
"debug": true,
"experimental": false
}
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文件。
先停止docker服务
systemctl stop docker
修改配置对应容器的hostconfig配置
"RestartPolicy": { "Name": "always", "MaximumRetryCount": 0 }
给运行容器追加端口
先停止docker服务
systemctl stop docker
修改对应容器的配置 ```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