赞
踩
docker pull [OPTIONS] NAME[:TAG]
docker pull hello-world
docker images
停止所有的container,这样才能够删除其中的images
docker ps -a 检查对应的镜像id进程和核实进程是否存在
docker rm f0b 删除对应容器id进程
docker rmi 116 删除对应的镜像id
docker images 检查镜像是否还存在
查看镜像列表
docker images
然后根据镜像id IMAGE ID,执行如下命令进行删除
docker rmi 8397388696e1
docker run hello-world
docker ps
看不到hello-world了:
hello-word它就是一个打印,打印完了,程序就结束了。进程就看不到了。。
拉取镜像
docker pull hub.c.163.com/library/nginx:latest
在前台启动镜像
docker run hub.c.163.com/library/nginx
在后台运行镜像,加 -d参数即可
docker run -d hub.c.163.com/library/nginx
在容器中运行一个命令,进入容器内部等
docker exec -it d4容器的id,可以只写前面一部分,只要docker能唯一的确定这个容器 bash要在容器中运行的命令,这里是bash就是给你一个bash环境。
docker exec -it d4 bash
多使用 --help查看命令参数含义 docker exec --help等
Bridage Host None
Docker网络入门(一) – 默认设置
参考URL: http://dockone.io/article/458
理解Docker(5):Docker 网络
参考URL: https://www.cnblogs.com/allcloud/p/7150564.html
“深入浅出”来解读Docker网络核心原理
参考URL: http://blog.51cto.com/ganbing/2087598
[推荐-讲的比较清晰]Docker Network入门用法
参考URL: https://loocode.com/post/10107
libnetwork共有5种内置驱动:bridge驱动、host驱动、overlay驱动、remote驱动、null驱动。
1、bridge驱动
此驱动为Docker的默认设置驱动,使用这个驱动的时候,libnetwork将创建出来的Docker容器连接到Docker网桥上。**作为最常规的模式,bridge模式已经可以满足Docker容器最基本的使用需求了。**然而其与外界通信使用NAT,增加了通信的复杂性,在复杂场景下使用会有诸多限制。
2、host驱动
使用这种驱动的时候,libnetwork将不为Docker容器创建网络协议栈,即不会创建独立的network namespace。Docker容器中的进程处于宿主机的网络环境中,相当于Docker容器和宿主机共同用一个network namespace,使用宿主机的网卡、IP和端口等信息。
但是,容器其他方面,如文件系统、进程列表等还是和宿主机隔离的。host模式很好地解决了容器与外界通信的地址转换问题,可以直接使用宿主机的IP进行通信,不存在虚拟化网络带来的额外性能负担。但是host驱动也降低了容器与容器之间、容器与宿主机之间网络层面的隔离性,引起网络资源的竞争与冲突。
因此可以认为host驱动适用于对于容器集群规模不大的场景。
3、overlay驱动
此驱动采用IETE标准的VXLAN方式,并且是VXLAN中被普遍认为最适合大规模的云计算虚拟化环境的SDN controller模式。在使用过程中,需要一个额外的配置存储服务,例如Consul、etcd和zookeeper。还需要在启动Docker daemon的时候额外添加参数来指定所使用的配置存储服务地址。
4、remote驱动
这个驱动实际上并未做真正的网络服务实现,而是调用了用户自行实现的网络驱动插件,使libnetwork实现了驱动的可插件化,更好地满足了用户的多种需求。用户只需要根据libnetwork提供的协议标准,实现其所要求的各个接口并向Docker daemon进行注册。
5、null驱动
使用这种驱动的时候,Docker容器拥有自己的network namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器除了network namespace自带的loopback网卡名,没有其他任何网卡、IP、路由等信息,需要用户为Docker容器添加网卡、配置IP等。
这种模式如果不进行特定的配置是无法正常使用的,但是优点也非常明显,它给了用户最大的自由度来自定义容器的网络环境。
# docker network ls
NETWORK ID NAME DRIVER SCOPE
879f8d1788ba backend bridge local
6c16e2b4122d bridge bridge local
d150ba23bdc0 frontend bridge local
这3个网络是Docker daemon默认创建的,分别使用了3种不同的驱动,而这3种驱动则对应了Docker原来的3种网络模式。需要注意的是,3种内置的默认网络是无法使用docker network rm进行删除的。
如果Docker容器不是使用none网络模式,默认是不需要再做任何配置就可以访问网络。但是,外部网络在默认情况下是不能访问容器的服务的。
Docker官方推荐我们通过端口映射的方式把Docker容器的服务提供给宿主机或者局域网其他容器使用。
容器默认就能访问外网。
我们查看一下 docker host (宿主机)上的 iptables 规则
iptables -t nat -S
返回结果:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
其含义是:! -o docker0 的意思是所有目标地址不是docker0的数据包(即访问外网)。这条规则是指:容器内部访问外网的包,会做NAT,然后通过host的网卡(比如enp0s3)发出去。
通过 NAT,docker 实现了容器对外网的访问。
从外部访问Docker
参考URL: https://blog.csdn.net/CSDN_LYY/article/details/70187663
在使用Bridge时,利用端口映射,使容器内的某个端口与容器所在主机上的某个端口做映射,当你访问主机的某个端口其实就是访问容器里面的映射的端口。
默认情况使用Bridage模式,默认我们没有告诉它端口怎么映射,所以我在主机上访问不到容器里面的端口。
因此使用,如下方法,添加映射,注意先停止容器。
使用docker run --help查看参数说明
主要是 -p手动指定
docker -d -p 8080主机的端口:80容器的端口 容器的名字
docker ps
docker stop dc60e24c907a
docker run -d -p 8080:80 hub.c.163.com/library/nginx
docker run -d -P --expose 443 nginx
-P选项Docker会把Dockerfile中的通过EXPOSE指令或–expose选项暴露的端口随机映射到临时端口。默认的nginx镜像的Dockerfile中会 EXPOSE 80。
查看端口映射关系
docker port 7101c41b0ca2
80/tcp -> 0.0.0.0:32773
443/tcp -> 0.0.0.0:32772
许多Linux内核预设的临时端口范围为32768 ~ 61000,你可以通过cat /proc/sys/net/ipv4/ip_local_port_range查看临时端口范围。
[推荐]docker for windows 容器内网通过独立IP直接访问的方法
参考URL: https://www.cnblogs.com/brock0624/p/9788710.html
以下在win10环境中队Docker容器通过独立IP暴露给局域网的方法进行记录。
Docker的默认启动方式中,会产生一块虚拟网卡,然后容器内自行分配单独的网卡和IP。可以在宿主机上通过ipconfig命令看到这个虚拟网卡。
通过配置路由表实现ip互通
C:\windows\system32>route -p add 172.17.0.0 MASK 255.255.0.0 10.0.75.2
由于docker默认采用bridge网络,每次容器启动时自动分配ip,我们可以创建自己的网络bridge1,在创建容器时指定ip,如需独立ip访问则另外增加路由。
如
route -p add 172.18.12.0 MASK 255.255.255.0 10.0.75.2
如果删除路由:
route delete 172.18.12.0
示例:
route -p add 172.17.0.0 MASK 255.255.0.0 10.0.75.2
route -p add 192.168.130.0 MASK 255.255.255.0 10.0.75.2
问题:理论上我网关应该设置成10.0.75.1,测试发现不行,设置成10.0.75.2,发现可以ping通容器ip。why?
猜测,应该是10.0.75.1是暴漏给windows的,真正windows下管理容器的是mobylinux,10.0.75.2应该是mobylinux。
在 linux 下,路由网关设置成10.0.75.1 应该就可以实现,宿主机访问容器ip,待测试。
启动Docker容器的时候,使用默认的网络是不支持指派固定IP的。
因此,需要创建自定义网络,下面是具体的步骤:
步骤1: 创建自定义网络
docker network create --subnet=192.168.130.0/24 mynetwork
通过docker network ls可以查看到网络类型中多了一个mynetwork
步骤2: 使用新的网络类型启动容器
docker run 加参数 --net mynetwork --ip 192.168.130.1
这个时候,创建的Docker容器就会持有 192.168.130.1 这个IP.
关于对docker run --link的理解
参考URL: https://www.jianshu.com/p/21d66ca6115e
docker 基于link 的互联
参考URL: https://blog.csdn.net/u013043762/article/details/80819473
–link的格式:
–link :alias
其中,name和id是源容器的name和id,alias是源容器在link下的别名。
docker间常常需要互联或者说通信,比如后台程序访问数据库容器,一般是需要ip+端口的形式,然而ip是经常会变化的,docker中采用link来为容器起个名字,以后访问只要名字+端口就行了,这样减少了ip访问下,ip常发生变化而导致的问题
默认情况下,容器使互联的。
docker 默认使允许container 互通的,通过-icc=false 关闭互通。一旦关闭了互通,只能通过-link name:alias 命令连接指定container .
–link redis:db 的别名,会在/etc/hosts 中生成对应的IP映射
注意!docker官方已不推荐使用docker run --link来链接2个容器互相通信,随后的版本中会删除–link,但了解其原理,对如何使2个容器之间互相通信还是有帮助的。
参考URL: https://www.cnblogs.com/gaoyuechen/p/9094477.html
docker run 只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可。
docker run相当于执行了两步操作:将镜像放入容器中(docker create),然后将容器启动,使之变成运行时容器(docker start)。
而docker start的作用是,重新启动已存在的镜像。也就是说,如果使用这个命令,我们必须事先知道这个容器的ID,或者这个容器的名字,我们可以使用docker ps找到这个容器的信息。
因为容器的ID是随机码,而容器的名字又是看似无意义的命名,我们可以使用命令
docker rename old_name new_name
给这个容器命名。这样以后,我们再次启动或停止容器时,就可以直接使用这个名字。
docker [stop] [start] new_name
而要显示出所有容器,包括没有启动的,可以使用命令
docker ps -a
Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令
解决:
apt-get update
apt install net-tools # ifconfig
apt install iputils-ping # ping
参考URL: https://blog.csdn.net/styshoo/article/details/78279762
解决方法
在启动容器时加上对应的privileged参数。
docker run --privileged -d -p 8080:80 hub.c.163.com/library/nginx
docker logs -f -t 881f151e6bcb7df2a59a7b05904156bccd952cca106201664d216c7be84e439a
实时查看docker容器日志
$ docker logs -f -t --tail 行数 容器名
例:实时查看docker容器名为s12的最后10行日志
$ docker logs -f -t --tail 10 s12
Docker容器的重启策略是面向生产环境的一个启动策略,在开发过程中可以忽略该策略。
Docker容器的重启都是由Docker守护进程完成的,因此与守护进程息息相关。
创建容器时没有添加参数 --restart=always ,导致的后果是:当 Docker 重启时,容器未能自动启动。
现在要添加该参数怎么办呢,如下
docker container update --restart=always 容器名字
Docker容器的重启策略如下:
no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
Docker容器的退出状态码
docker run的退出状态码如下:
0,表示正常退出
非0,表示异常退出(退出状态码采用chroot标准)
125,Docker守护进程本身的错误
126,容器启动后,要执行的默认命令无法调用
127,容器启动后,要执行的默认命令不存在
其他命令状态码,容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码
需要更新运行中容器的restart策略,可以使用该命令:
···
docker update --restart=no my-container
···
Docker inspect 命令
参考URL: https://blog.csdn.net/zl1zl2zl3/article/details/80676830
docker inspect : 获取容器/镜像的元数据。
-f :指定返回值的模板文件。
docker search centos
docker pull centos
docker images
使用一下centos的镜像
docker run centos echo hello world
查看一下最后一条容器记录信息(-l参数 ) 不加参数,就是查看当前运行容器。
docker ps -l
登录docker中的CentOS7
docker run -ti centos /bin/bash
(1)查看容器id(container ID) docker ps -a
(2)进入到容器内部 docker exec -it 6b654059476e /bin/bash
-it参数后面是容器的id
查找所有容器
docker ps -a
找出我们想要的容器名字
查找容器长ID
docker inspect -f '{{.ID}}' modest_ritchie
docker cp 本地路径 容器长ID:容器路径
docker cp E:\docker\jdk-8u191-linux-x64.tar.gz 8ce69425726ad53158e35b414e464cd73b0024e8b7543eaa05925a25b73a9a73:/
如下看到正常放置进去了
【PRACTISE】基于Docker构造centos-java8镜像
参考URL: https://blog.csdn.net/lingchaoqing/article/details/81198586
利用centos:7.5.1804 构建Java基础镜像
参考URL: https://blog.csdn.net/nie312122330/article/details/81563015
制作jdk基础镜像
参考URL: https://blog.csdn.net/chenhaifeng2016/article/details/78631215
除了使用dockerfile,然后使用docker build制作镜像,我们可以手动运行容器,登录docker容器配置好所有配置后,(可以将更改后的容器提交,制作成镜像)直接制作好自己想要的基础镜像。
因为是制作基础镜像,个人比较喜欢此方法。
mkdir /usr/java
cp jdk-8u191-linux-x64.tar.gz /usr/java/
cd /usr/java/
tar -zxvf jdk-8u191-linux-x64.tar.gz
#得到文件夹jdk1.8.0_191
cd jdk1.8.0_191
运行vim /etc/profile,在文件末尾输入以下几行
#添加如下内容:JAVA_HOME根据实际目录来
export JAVA_HOME=/usr/java/jdk1.8.0_191
export CLASSPATH=.:
J
A
V
A
H
O
M
E
/
l
i
b
/
d
t
.
j
a
r
:
JAVA_HOME/lib/dt.jar:
JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
export PATH=
P
A
T
H
:
PATH:
PATH:JAVA_HOME/bin
运行source /etc/profile,使/etc/profile文件生效
运行java -version或echo $JAVA_HOME
至此已经完成了jdk8的配置。
docker commit :从容器创建一个新的镜像。
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
docker commit -a "shepf" -m "jdk1.8 add" 8ce69425726a centos:v1
docker images
再次查看镜像,发现镜像centos:v1已经提交到本地了
docker push [OPTIONS] NAME[:TAG]
目前上传本地镜像到网上有多种途径,一个是上传到hub上,一个是阿里云镜像仓库,还要其他服务器。
上传到hub上实在是太慢了,我的服务器用的是阿里云,所以选择上传到阿里云镜像仓库中。
docker login --username=shepf2018 registry.cn-hangzhou.aliyuncs.com
docker tag 5eb755cf1b36 registry.cn-hangzhou.aliyuncs.com/shepf/centos:v1
docker push registry.cn-hangzhou.aliyuncs.com/shepf/centos:v1
参考URL: https://blog.csdn.net/hknaruto/article/details/70241618
Alpine Linux 使用简介
参考URL: https://blog.csdn.net/CSDN_duomaomao/article/details/76152416
Docker之操作系统Alpine
参考URL: https://blog.csdn.net/bbwangj/article/details/81088231
Alpine 由非商业组织维护的,支持广泛场景的 Linux发行版,它特别为资深/重度Linux用户而优化,关注安全,性能和资源效能。Alpine 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
TODO 预研大厂 的基础镜像 都是基于哪个linux,是apline么?
关于Docker目录挂载的总结
参考URL: https://www.cnblogs.com/ivictor/p/4834864.html
挂载目录后镜像内就可以共享宿主机里的文件
通过 run -v 参数指定挂载目录(格式:宿主机目录:镜像内挂载目录),如果宿主机目录不存在则创建
Centos7 中本地挂载的目录在容器中没有执行权限,通过 --privileged=true 给容器加特权
docker run -it -v /home/dockershare/data:/data centos
此时可看到宿主机上 /home/dockershare/ 文件夹下多出了 /data 目录
因为通过 -it 参数,已进入容器内部,通过 ls -a 命令查看文件夹,可看见多出 /data 目录,通过 cd 命令进入文件夹下并新建文件 touch a.txt
可看见宿主机 /data 目录也会存在该文件
window环境 IDEA docker插件配置映射路径
第一步
idea->setting->docker 配置path mapping 该配置指你的window的路径与你本地安装的运行docker的linux主机的映射关系(安装docker默认安装该linux,docker是基于linux的技术)
第二步
在具体的容器的配置项,中编辑volumn bindings中添加,容器中的路径到你的真实主机的路径,选择host path,就可以看到,您直接已经映射到了docker宿主机的路径,选择一个即可。
注意点:
使用idea docker插件时,在创建容器之前就需要把bind mount如下图,写好
然后在创建好的容器,右边的配置项中看到你的volume bindings的配置
经过测试
注意点:如何一个容器不是你idea docker插件启动的(比如你命令行启动的容器),idea插件虽然看可以看到,但是你就不能编辑这个容器的配置,即使再右边编辑了,也不会生效。直接在容器上右键弹不出编辑配置界面。
如果这个容器是你用idea启动的,那么就可以改映射端口之类,改完,直接就生效了,不用你手动重启容器,idea插件帮你做了。
总结: windows下映射,相当于window先映射路径到docker宿主机上,让后docker宿主机再映射到docker容器中。
Docker内如何访问本机(宿主机)
参考URL: https://blog.csdn.net/u010416101/article/details/80534013
有时候就需要在docker容器里访问宿主机提供的服务。
例如容器里的应用需要访问宿主机的mysql服务。
一般每个容器,都会映射一个端口到宿主机中,方便在宿主机上访问,例如ngnix,mysql,redis等等。
但是我们有一种常见的场景,就是a容器,需要通过宿主机的端口映射,调用b容器的服务,这里如果在a容器内部配置localhost/127.0.0.1/0.0.0.0:port都是不会起作用的,因为容器和容器之间的ip是隔离的,无法互相通过本地端口访问。
容器和容器之间的ip是隔离的,无法互相通过本地端口访问。
Docker内需要访问本机的数据库,如何访问。使用127.0.0.1肯定是不行的,因为这个在Docker容器里面指的是容器本身。所以,需要走别动渠道进行解决。
docker内部实际上实现了一个虚拟网桥docker0,需要通过网桥找到外部宿主机的在网桥的虚拟地址,也就是docker.for.mac.host.internal,就可以实现容器内访问外部宿主机。
[推荐]方案一:
宿主机执行ifconfig
会看到docker0那个ip,可以使用来访问宿主机
注意:有些容器不带ifconfig,所以需要yum安装
想看到docker容器的ip地址,只需要安装net-tools就可以了,之后就可以用ifconfig查看了
yum install net-tools -y
方案二:
docker 18.03 加入了一个 feature,在容器中可以通过 host.docker.internal来访问主机
Use your internal IP address or connect to the special DNS name host.docker.internal which will resolve to the internal IP address used by the host.
方案三:
/sbin/ip route|awk ‘/default/ { print $3 }’
得到的宿主机ip, 加上对应的端口,就可以访问其他容器的服务了
在windows上使用的docker环境,发现使用ifconfig 看不到docker0,坑点,注意理解docker网络,应该是在宿主机上ifconfig查看,我在容器里面自然看不到这个接口,容器主机看到自然只有自己的ip。
docker0 网桥默认的是172.17.0.1
在windows下使用如下命令查看网络
$docker network ls
$docker network inspect bridge
docker0只是默认172.17.0.1,这个是默认得一个桥接网卡。
win10中
Docker的默认启动方式中,会产生一块虚拟网卡,然后容器内自行分配单独的网卡和IP。可以在宿主机上通过ipconfig命令看到这个虚拟网卡(dockerNAT)。
** 暴露给宿主机的为10.0.75.1 **
经过测试,使用10.0.75.1 内部容器还是访问不到宿主机上映射的其它容器(mysql)的端口。
总结: window环境,查看保留给容器主机的ip,应该是ipconfig 查看到的dockerNAT接口地址。
window比较特殊,永远记住,真正的docker运行在linux下,windows下真正的宿主机还是在linux,所以一些细节点比较特殊。
在Linux环境使用docker0接口ip,就可以访问到主机。
但是 mac 和 windows 开发环境下不会出现这个网卡也没有这样一个 IP 来访问,不过最新的 docker 18.03 加入了一个 feature,在容器中可以通过 host.docker.internal hostname 来访问主机,解析得到的 ip 是 192.168.65.2 正是 docker 的设置中的子网网段。
详情参考官方文档:
https://docs.docker.com/docker-for-mac/networking/#there-is-no-docker0-bridge-on-macos
https://docs.docker.com/docker-for-windows/networking/#httphttps-proxy-support 关键字 “There is no docker0 bridge on Windows”
Because of the way networking is implemented in Docker for Windows, you cannot see a docker0 interface on the host. This interface is actually within the virtual machine.
I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST
The host has a changing IP address (or none if you have no network access). From 18.03 onwards our recommendation is to connect to the special DNS name host.docker.internal, which resolves to the internal IP address used by the host. This is for development purpose and will not work in a production environment outside of Docker for Windows.
The gateway is also reachable as gateway.docker.internal.
官网已经说的很明白了,window下 推荐使用一个特殊dns host.docker.internal来访问宿主机。仅仅用于开发目的,生产环境不能这么用。
在 Docker 容器中访问主机
[]参考URL: https://rabbit52.com/2018/05/access-host-from-docker-container/
有时候多个容器不是在一个 compose 中启动的,不方便 link 起来或者是有些服务是直接跑在主机上的,所以从容器访问主机的场景十分普遍,我们需要一个类似 127.0.0.1 的 IP 地址能在容器中访问到主机。在 linux 环境中这个问题很好解决,安装完 docker 之后会出现一个 docker0 的网卡,这个网卡上绑定的 IP 就可以在容器中访问,并指向主机,默认情况下会是 172.17.0.1
1、在容器外部,物理机上,可以用docker inspect查看或者,docker inspect container。
2、如果在容器内部。可以用 ps -fe 查看。其中1号进程就是启动命令。
有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动,
现在要添加该参数怎么办呢,方法有二:
1、Docker 命令修改
docker container update --restart=always 容器名字
2、直接改配置文件
首先停止容器,不然无法修改配置文件
配置文件路径为:/var/lib/docker/containers/容器ID
在该目录下找到一个文件 hostconfig.json ,找到该文件中关键字 RestartPolicy
修改前配置:“RestartPolicy”:{“Name”:“no”,“MaximumRetryCount”:0}
修改后配置:“RestartPolicy”:{“Name”:“always”,“MaximumRetryCount”:0}
最后启动容器。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。