声明: 我用的是mac,以下不做说明一般都是在mac上做的操作。
一. docker简介---docker初使用
Docker 查看版本
docker version
docker查找 tutorial镜像
docker search tutorial
下载仓库镜像到本地
docker pull learn/tutorial
运行镜像
docker run learn/tutorial echo ‘hello world’
向learn/tutorial容器中安装ping命令
docker run learn/tutorial apt-get install -y ping
docker ps -l
提交镜像,相当于新创建了个镜像learn/ping是起的名字
docker commit id号 learn/ping
用新镜像运行个容器
docker run learn/ping ping www.baidu.com
查看当前运行的容器
docker ps
查看运行中的容器
docker inspect 容器id
查看有哪些镜像
docker images
将新创建的镜像保存到github中
push命令保存镜像到github上
docker push learn/ping
注意:
1. docker images命令可以列出所有安装过的镜像。
2. docker push命令可以将某一个镜像发布到官方网站。
3. 你只能将镜像发布到自己的空间下面。这个模拟器登录的是learn帐号。
二. 安装docker
Ubuntu 14.04安装docker
-
查看内核版本
uname -a
2.检查Device Mapper
ls -l /sys/class/misc/device-mapper
依赖关系:
Ubuntu 14.04版本无需安装额外的依赖包,可以直接安装。
安装步骤:
使用管理员帐号登录ubuntu 14.04系统,保证该管理有root权限,或者可以执行sudo命令。
检查curl包有没有安装。
$ which curl
如果curl没有安装的话,更新apt源之后,安装curl包。
$ sudo apt-get update
$ sudo apt-get install curl
获得最新的docker安装包。
$ curl -sSL https://get.docker.com/ | sh
shell会提示你输入sudo的密码,然后开始执行安装过程。
确认Docker是否安装成功。
这个命令会下载一个测试用的镜像并启动一个容器运行它。
$ sudo docker run hello-world
额外补充:
使用非root用户启动docker
1.sudo groupadd docker
2.sudo gpasswd -a ${USER} docker
3.sudo service docker restart
需要注销docker再重新登录下docker才能生效
不用sudo验证
docker version
在windos中安装docker
http://www.docker.org.cn/book/
在mac os下安装docker
去docker官网下载dmg文件,注册自己的dockerhub账号登录,
查看docker版本
docker version
用ubuntu镜像输出hello world 如果没有ubuntu镜像,docker会默认给下载个最新的ubuntu镜像
docker run ubuntu echo 'hello world'
以交互式运行
docker run -i -t ubuntu /bin/bash #
-i --interactive=ture|false 默认是false 始终打开标准输入
-t --tty=true|false 默认是false 为docker分配个伪tty终端
这样新创建的容器才能提供个交互式的shell
在ubuntu容器中就和在ubuntu服务器一样 执行ps -ef 测试 exit退出
docker容器的基本操作
docker ps [-a][-l]
-a表示列出所有创建的容器
-l 表示列出最新创建的容器
查看指定容器详细配置信息
docker inspect [id或者名字]
自定义容器名
docker run --name=自定义名 -i -t IMAGE /bin/bash
重新启动和停止容器:
docker start [-i] 容器名
删除停止的容器:(不能删除正在运行的容器)
docker rm 容器名
守护式容器: 什么是守护式容器: 能够长期运行 没有交互式会话 适合运行应用程序和服务
docker run --name=自定义名 -i -t IMAGE /bin/bash
Ctrl+P Ctrl+Q组合键退出容器
这样会以后台运行
附加到运行中的容器:
docker attach 容器名
执行exit看到容器停止了
守护式容器
启动守护式容器:
docker run -d 镜像名[COMMAND][ARG...]
docker run --name dc1 -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
查看容器日志:
docker logs [-f][-t][--tail] 容器名
-f --follows=true|false 默认为false 一直跟踪日志的变化并返回结果
-t --timestamps=true|false 默认为false 返回的结果上加上时间戳
--tail="all" 返回结尾处多少数量的日志
不指定返回logs所有的日志
-tf一直跟新,按Ctrl+c停止
--tail 10 最近十条
-tail 0 最近的一条
查看容器内进程:
docker top 容器名
在运行的容器内启动新进程:
docker exec [-d][-i][-t] 容器名 [COMMAND][ARG...]
24120是我们在容器中加进去的进程
停止守护式容器:
docker stop 容器名
docker kill 容器名
在容器中部署静态网站
设置容器的端口映射
run [-P][-p]
-P, --publish-all=true|false 默认为false #为容器暴露的所有端口映射
docker run -P -i -t ubuntu /bin/bash
-p, --publish=[] #可以指定映射哪些容器的端口
小写的p有四种格式
containerPort #只指定容器的端口,宿主机的端口随机映射
docker run -p 80 -i -t ubuntu /bin/bash
hostPort:containerPort #容器和宿主机的端口都指定
docker run -p 8080:80 -i -t ubuntu /bin/bash
ip::containerPort
docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash
ip:hostPort:containerPort
docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash
Nginx部署流程
-
创建映射80端口的交互式容器
docker run -p 80 --name web -i -t ubuntu /bin/bash
-
安装nginx
apt-get update apt-get install -y nginx
-
安装文本编辑器vim
apt-get install -y vim
-
创建静态页面
mkdir -p /var/www/html cd /var/www/html vim index.html
<html> <head> <title>Nginx in Docker</title> </head> <body> <h1>Hello, I`m website in Docker!</h1> </body> </html>
-
修改nginx配置文件
whereis nginx #查找nginx的位置
-
打开nginx的配置文件
vim /etc/nginx/sites-enabled/default #root指定到自己创建的静态文件目录,如果一致就不用修改了。
-
运行nginx
cd / nginx
Ctrl+P+Q退出,让容器在后台运行。
-
验证网站访问
curl http://127.0.0.1:32768
或者在浏览器输入
练习:
停止web容器
启动web容器
Ctrl+P+Q让容器后台运行。
启动web容器中nginx服务
查看web容器配置
查看和删除镜像:
列出镜像
镜像标签和仓库
查看镜像
删除镜像
docker images [OPTIONS] [REPOSITORY[:TAG]]
-a, --all=false #显示所有镜像,默认不显示中间层的镜像
--digests #显示摘要
-f, --filter=[] 过滤条件
--format string 使用Go模板打印漂亮的图像
--no-trunc=false 指定不使用截断的形式显示镜像的id
-q, --quiet=false 只显示镜像的id
可以为相同的镜像打上不同的标签
docker images --no-trunc
docker images -a
docker images -q
docker images ubuntu
查看镜像
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
-f, --format=” ”
删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
Options:
-f, --force=false 强制删除图像
--no-prune=false 会保留未打标签的父镜像
docker rmi ubuntu:latest
根据镜像仓库和标签只能删除一个
docker rmi 4e5021d210f6
#根据镜像id能删除多个
在运行的无法删除必须指定
删除多个
docker rmi ubuntu:latest admin:1.0.0
删除ubuntu中所有镜像
docker rmi $(docker images -q ubuntu)
docker批量删除容器、镜像
1、删除所有容器
docker rm -f `docker ps -a -q`
2、删除所有镜像
docker rmi -f `docker images -q`
3、按条件删除镜像
//镜像名包含关键字 其中none为关键字
$ docker rmi -f $(docker images -q | grep "none" | awk '{print $3}')
停止容器
docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }')
按条件删除容器
docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')
获取和推送镜像
docker search [OPTIONS] TERM
-f, --filter filter 过滤条件
--limit int 默认最大查25条
--no-trunc 显示全id
docker search --filter=stars=4 ubuntu
docker search --limit 4 ubuntu
拉取镜像
docker pull ubuntu:14.04
2.使用 --registry-mirror选项
如果之前没用过,最好把自己的镜像上传到dockerhub或者私有部署上,这样设置完有可能会更新docker导致你的镜像和容器丢失。
https://www.daocloud.io
https://www.daocloud.io/mirror
配置 Docker 镜像站
-
Linux
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
该脚本可以将 --registry-mirror 加入到你的 Docker 配置文件
/etc/docker/daemon.json 中。适用于 Ubuntu14.04、Debian、CentOS6 、CentOS7、Fedora、Arch Linux、openSUSE Leap 42.1,其他版本可能有细微不同。更多详情请访问文档。
-
macOS
Docker For Mac
右键点击桌面顶栏的 docker 图标,选择 Preferences ,在 Daemon 标签(Docker 17.03 之前版本为 Advanced 标签)下的 Registry mirrors 列表中
加入下面的镜像地址:
http://f1361db2.m.daocloud.io
点击 Apply & Restart 按钮使设置生效。
Docker Toolbox 等配置方法请参考帮助文档。
- Windows
Docker For Windows
在桌面右下角状态栏中右键 docker 图标,修改在 Docker Daemon 标签页中的 json ,把下面的地址:
http://f1361db2.m.daocloud.io
加到" registry-mirrors"的数组里。点击 Apply 。
mac上遇到的问题:
当你重新下载镜像测试的时候可能报错,这个时候你需要重启reset factory,启动docker 的时候点击第一个按钮
dawn-2:~ root# docker pull ubuntu:12.10
Error response from daemon: Bad response from Docker engine
重新登录dockerhub就可以了
注意:登录上去我之前的本地镜像都没了。呵呵
这个是我用的中国科技大学的国内镜像
https://docker.mirrors.ustc.edu.cn
开始推送镜像到dockerhub上
推送镜像的规范是:
- docker push 注册用户名/镜像名
tag命令修改为规范的镜像:
docker tag ubuntu:12.10 hexiaoming/ubuntu
docker login
输入dockerhub用户名
输入dockerhub密码 #mac提示
你没有找到xxx的秘钥串,这个时候点击
还原默认值
输入dockerhub的密码看到shell 页面Login Succeeded登录成功了
这个时候可以上传了
docker push hexiaoming/ubuntu
看dockerhub已经上传上去镜像,dockerhub上私有仓库只能有一个
-
使用commit构建镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] -a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>") -c, --change list Apply Dockerfile instruction to the created image -m, --message string Commit message -p, --pause Pause container during commit (default true)
-
启动个交互式容器
docker run -it -p 80 --name commit_test ubuntu /bin/bash apt-get update apt-get install -y nginx exit
-
把容器提交为镜像
docker commit -a 'hexiaoming' commit_test hexiaoming/commit_test1 docker images
-
用镜像运行个容器(容器启动时运行nginx命令,已后台运行-d)
docker run -d --name nginx_web2 -p 80 hexiaoming/commit_test1 nginx -g "deamon off;" curl http://127.0.0.1:8080验证
-
使用dockerfile构建镜像
创建dockerfile 使用docker build命令 #First Dockerfile FROM ubuntu:14.04 #镜像的基础 MAINTAINER hexiaoming "17710146600@163.com" #镜像的维护人 RUN apt-get update #执行的命令 RUN apt-get install -y nginx EXPOSE 80 #暴露的端口
docker build参数
docker build [OPTIONS] PATH | URL | -
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Dockerfile的名称(默认为“PATH/Dockerfile”)
--force-rm 始终移除中间容器,默认为false
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--network string Set the networking mode for the RUN instructions during build (default "default")
--no-cache 生成图像时不要使用缓存 ,默认为false
--pull 总是尝试提取较新版本的镜像,默认为false
-q, --quiet 成功时抑制生成输出并打印图像ID默认为false
--rm 成功生成后删除中间容器(默认为true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list 给镜像取个名字
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
正确的dockerfile格式
#First Dockerfile
FROM ubuntu:14.04
#镜像的维护人
MAINTAINER hexiaoming "17710146600@163.com"
RUN apt-get update
RUN apt-get install -y nginx
#暴露的端口
EXPOSE 80
查看镜像
docker images
运行镜像
docker run -d --name nginx_web3 -p 80 hexiaoming/df_test1 nginx -g "deamon off;"
注释:run后加-g "deamon off;"的原因:
容器启动时执行的那条入口命令一旦结束了,容器也会结束。如果启动命令单纯是以后台守护(daemon)模式启动nginx,那么启动命令会立即结束,容器也会立即结束。
其实只要在任何命令之后加一句 && cat,就会让这条命令卡在前台而不会结束,不是非得用daemon off
docker本地访问
Remote API没有了可以用engine/api/ https://docs.docker.com/engine/api/
原文:
Docker provides an API for interacting with the Docker daemon (called the Docker Engine API), as well as SDKs for Go and Python. The SDKs allow you to build and scale Docker apps and solutions quickly and easily. If Go or Python don’t work for you, you can use the Docker Engine API directly.
翻译:
Docker提供了一个用于与Docker守护进程进行交互的API(称为Docker Engine API),以及Go和Python的SDK。使用SDK,您可以快速轻松地构建和扩展Docker应用程序和解决方案。如果Go或Python不适用于您,则可以直接使用Docker Engine API。
运行过Docker Hub的Docker镜像的话,会发现其中一些容器时需要挂载/var/run/docker.sock文件。这个文件是什么呢?为什么有些容器需要使用它?简单地说,它是Docker守护进程(Docker daemon)默认监听的Unix域套接字(Unix domain socket),容器中的进程可以通过它与Docker守护进程进行通信。
我的docker engineAPI版本
官方文档
https://docs.docker.com/engine/api/sdk/examples/
测试
curl --unix-socket /var/run/docker.sock http:/v1.24/images/json
http例子可以继续参考这个。
https://docs.docker.com/engine/api/v1.40/#
第三方的库,用于代码方式链接docker
https://docs.docker.com/engine/api/sdk/
docker守护进程的配置和操作
查看守护进程
ps -ef | grep docker
linux上使用启动docker查看docker状态
sudo status docker不行就用
systemctl status docker不行就用
sysvinit status docker
sudo service docker stop
sudo service docker start
sudo service docker restart
FROM #镜像的基础 已经存在的镜像,基础镜像,必须是第一条非注释指令
MAINTAINER #镜像的维护人
RUN指定当前镜像中运行的命令
#执行的命令 因为镜像分层,下个run指令会在当前镜像创建个新镜像运行当前的命令,
如果把两个run命令用&&连接起来会减少重复构建镜像。其实都差不多,docker是集装箱一样增量构建。
RUN <command> (shell模式)
/bin/sh -c command
RUN echo hello
RUN ["executable","param1","param2"](exec模式)
RUN ["/bin/bash","-c","echo hello"]
EXPOSE指定运行该镜像的容器使用的端口
EXPOSE <port>[<port>...]
但是处于安全考虑docker容器并不会自动打开端口,需要我们手动去指定打开端口。
CMD ["executable","param1","param2"](exec模式)
CMD command param1 param2 (shell模式)
CMD ["param1","param2"](作为ENTRYPOINT指令的默认参数)
run和cmd区别
run是在镜像构建过程中运行的,cmd是在容器运行时运行的
如果用docker run 启动一个容器制定了容器运行时命令,cmd中的指令会被覆盖不会执行。
示例
之前的运行容器命令
docker run -d --name nginx_web3 -p 80 hexiaoming/df_test1 nginx -g "deamon off;"
如果dockerfile中加了CMD ["/usr/sbin/nginx","-g" ,"deamon off;"] 这里就可以去掉nginx -g "deamon off;" 写为
docker run -d --name nginx_web3 -p 80 -d hexiaoming/df_test1
如果这里run指定了cmd命令会覆盖调dockerfile中的cmd命令
docker run -d --name cmd_test2 -p 80 hexiaoming/df_test1 /bin/bash
ENTRYPOINT["excutable","param1","param2"](exec模式)
ENTRYPOINT command param1 param2 (shell模式)
唯一和cmd区别就是ENTRYPOINT 不会被启动命令所覆盖,
如果需要覆盖可以使用docker run --entrypoint覆盖。
ENTRYPOINT 可以和CMD组合使用。
例如 dockerfile中
ENTRYPOINT [/usr/sbin/nginx]
CMD [-h]
运行docker容器
docker run -d --name nginx_web3 -p 80 -d hexiaoming/df_test1 -g "deamon off;"
这时会覆盖cmd中参数。
ADD <src>...<dest>
ADD["src"..."dest"](适用于文件路径中有空格的情况)
来源地址如果是本地地址必须是构建目录中的相对地址,docker不推荐使用远程地址推荐用wget之类的下载下来再指定。
目标路径需要指定镜像中的绝对路径
COPY <src>...<dest>
COPY["src"..."dest"](适用于文件路径中有空格的情况)
ADD vs. COPY
ADD 包含类似的tar的解压功能
如果单纯复制文件,Docker推荐使用COPY
示例
在dockerfile目录添加了个index.html文件替换docker中nginx的默认页
向容器中添加卷
VOLUME ["/data"]
在构建中为后续的指令指定工作目录,一般使用绝对路径,如果是相对路径工作目录会一直传递下去
WORKDIR /path/to/workdir
设置环境变量
构建过程中及运行运行过程中同样有效
ENV <key><value>
ENV <key>=<value>...
镜像会以什么用户去运行
USER daemon
示例
会以nginx的用户去运行
USER nginx
可以是任意组合,不指定以root用户去运行
镜像触发器
当一个镜像被其他镜像作为基础镜像时执行 会在构建过程中插入指令
ONBUILD [INSTRUCTION]
ONBUILD 中指定的命令并不会在本次镜像构建过程中构建。
dockerfile构建过程
中间层的容器会删除,镜像会保留,可以根据中间层镜像进行调试、查找错误
-
构建缓存
docker会把之前的镜像看做缓存 当你执行同样的命令构建镜像,会使用缓存 不使用缓存 docker build --no-cache
docker容器的网络连接 以下得在linux运行
-
docker容器的网络基础docker0
sudo apt-get install bridge-utils sudo brctl show
ifconfig查看linux会有docker0的网桥
macos没有得装软件,往下继续看
OSI七层模型中的网桥
- linux虚拟网桥的特点:
linux修改docker0地址:
ifconfig查看docker0网卡地址为172.121.1.2
修改地址
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0
sudo service docker restart
docker run -it ubuntu /bin/bash
ifconfig
echo已经修改为我们修改的地址
自定义虚拟网桥
sudo vim /etc/default/docker
增加DOCKER_OPS="-b=br0"
docker容器的互联
- 以下是linux中的操作,因为依赖linux的iptables
一个宿主机上的docker容器默认可以互联。
指定docker间不能访问。在默认配置文件中添加
DOCKER_OPS="--ICC=false"
启动cct3链接到cct1上给cct1起别名webtest
用虚拟机访问docker 中的端口能访问通
查看当前虚拟机地址
查看cct6的端口映射为49154
docker容器的数据管理
这个不依赖linux系统的iptables,在mac上可以操作
- docker容器的数据卷
docker run -it -v /tmp:/data ubuntu /bin/bash
docker inspect fc8d003898d5
设置为加载卷只读
docker run -it -v /tmp:/data:ro ubuntu /bin/bash
docker inspect fce42ddc61ecs
使用dockerfile构建包含数据卷的镜像
VOLUME ["/data"]
docker build -t ubuntu .
docker run --name dvt3 -it ubuntu
exit
docker inspect dvt3
docker 的数据卷容器
什么是数据卷容器:
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。
挂载数据卷容器的方法
docker run --volumes-from [CONTAINER NAME]
-
创建数据卷容器dvt4
docker run -it --name dvt4 ubuntu
-
在下边创建个文件
-
使用容器dvt5去挂载这个数据卷容器
docker run -it --name dvt5 --volumes-from dvt4 ubuntu /bin/bash
也在下边创建个新文件
使用容器dv6 去挂载这个数据卷容器 在下边查看文件发现文件数据是同步的
docker run -it --name dvt6 --volumes-from dvt4 ubuntu /bin/bash
docker inspect --format="{{.Mounts}}" dvt5 docker inspect --format="{{.Mounts}}" dvt6
这俩容器的数据挂载的数据是一致的
使用数据卷容器挂载数据这个容器起到的作用:是将挂载配置传递到挂载了数据卷容器的应用容器中
以下是验证过程:
docker数据卷的备份和还原
备份的原理:创建一个数据卷容器,在创建一个引用数据卷容器的新容器,并设置数据卷为本地下的某个目录,并用tar -cvf 命令对数据卷目录进行打压缩。
备份:
必须以以下格式:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar cvf /backup/backup.tar 数据卷
示例:
cd /tmp
docker run --volumes-from dvt5 -v /tmp:/backup --name dvt10 ubuntu tar cvf /backup/dvt5.tar /datavolume1
还原:
必须以以下格式:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar xvf /backup/backup.tar
新打开个shell,进入到dvt5数据卷容器删除数据
开始还原
示例:
docker run --volumes-from dvt5 -v /tmp:/backup --name dvt11 ubuntu tar xvf /backup/dvt5.tar
在dvt5数据卷容器又看到数据了
docker跨主机连接
-
使用网桥实现跨主机容器连接
网络拓扑
还没在mac上安装这些。先整理出来,以后再安装。
网络设置
docker设置
reboot
另一台虚拟机
2. 使用open vswitch实现跨主机容器连接
环境准备
操作
Host2
因为要查找路由表
添加路由表查找指定机器,启动容器
3.使用weave实现跨主机容器连接
环境准备
操作
curl -L git.io/weave -o /usr/bin/weave #下载用这个下载也行
chmod a+x /usr/bin/weave #赋予执行权限
weave launch #启动weave
格式:
weave launch ip | hostName #节点启动的时候连接到master (创建weave网络的主机叫master)
虚拟机2上的docker下载weave和1一样不做演示
192.168.59.103是虚拟机1上docker的地址
192.168.1.2是给虚拟机2上docker分配的地址
在虚拟机1上docker指定和虚拟机2上指定相同网段的地址,启动docker,
ping虚拟机2上docker容器,可以ping通
dockerfile 外部jdk和tomcat示例
docker images
使用Docker快速搭建Mysql,并进行数据卷分离
https://www.jianshu.com/p/57420240e877
来源:oschina
链接:https://my.oschina.net/u/3730149/blog/3216694