Docker Note
Docker简介
是什么
应用容器,小型虚拟机(VMware)
不同之处:容器开销极低,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
Docker的优点。
使用场景
1. 在一台linux中心服务器中,部署所有的实验,安全隔离。
2. 最大化,弹性计算。
3. 解决多服务器之间的,版本和兼容问题。
4. 快速开发,简易部署。
Docker 网络
我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:
· host模式,使用–net=host指定。
· container模式,使用–net=container:NAME_or_ID指定。
· none模式,使用–net=none指定。
· bridge模式,使用–net=bridge指定,默认设置。
Bridge模式(起了一个虚拟网卡)
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
这一段可不看。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
bridge模式如下图所示:
演示:
#docker run -tid --net=bridge --name docker_bri1 ubuntu-base:v3
#docker run -tid --net=bridge --name docker_bri2 ubuntu-base:v3
#brctl show
#docker exec -ti docker_bri1 /bin/bash
#docker exec -ti docker_bri1 /bin/bash
#ifconfig –a
#route –n
Host模式(类似于继承了主机的网卡)
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
Host模式如下图所示:
演示:
#docker run -tid --net=host --name docker_host1 ubuntu-base:v3
#docker run -tid --net=host --name docker_host2 ubuntu-base:v3
#docker exec -ti docker_host1 /bin/bash
#docker exec -ti docker_host1 /bin/bash
#ifconfig –a
#route –n
Container(实现容器共享)
Container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
Container模式示意图:
演示:
#docker run -tid --net=container:docker_bri1 --name docker_con1 ubuntu-base:v3
#docker exec -ti docker_con1 /bin/bash
#docker exec -ti docker_bri1 /bin/bash
#ifconfig –a
#route -n
None模式(无网络模式)
None模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
Node模式示意图:
演示:
#docker run -tid --net=none --name docker_non1 ubuntu-base:v3
#docker exec -ti docker_non1 /bin/bash
#ifconfig –a
#route -n
总结
网络损耗图
Hello World
第一个程序总是从HelloWorld开始…
hello-world是个镜像
Linux安装
apt-get install -y docker-ce
如果失败
官网说明文档安装
https://docs.docker.com/install/linux/docker-ce/debian/
Docker初体验
Lovely whalesay
Ubuntu
界面直接输出了 “Hello World”
如果不写tag,15.10,则默认运行最新的。
Ubuntu图形化界面
也可以使用命令(VNC Viewer设置密码):
Nginx服务
已经启动,并修改了文件了:
如果不知道容器应用的端口,可以大P随机暴露端口
Mysql
• -p 3307:3306:将容器的 3306 端口映射到主机的 3307 端口。
• -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
• -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
• -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
• -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
进入mysql方法:
回车 进入mysql数据库,可直接在-p后链接输入,如:-p123456,用户没有设置密码,显示Enter password时,直接回车即可。
其中-h表示服务器名,localhost表示本地,分开或者黏在一起写都可以(-hlocalhost, –h localhost);-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,
Tomcat使用
进入tomcat容器内部:
Python的使用
Apache的使用
指定目录报错的,待解决:
Apache与Tomcat有什么关系和区别_金在峰_cnblogs
似懂非懂的解释:Apache貌似是个静态服务器,负责页面转发之类的,是不是类似nginx?
Tomcat是支持java的,是个Servlet容器。
Docker基本操作
docker命令大全_菜鸟教程
仓库 (Repository)
仓库是集中存放镜像文件的场所。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载, 但是国内访问速度奇慢。国内的公开仓库包括 时速云 、网易云 等,可以提供大陆用户更稳定快速的访问。
用户也可以在本地网络内创建一个私有仓库。
Docker 仓库的概念跟 Git 类似,可以pull, push
镜像(Images)
罗列本地镜像:# docker images
搜索仓库里的镜像:# docker search jetty
提交镜像:docker commit -m=“has update” -a=“runoob” e218edb10161 runoob/ubuntu:v2
• -m: 提交的描述信息
• -a: 指定镜像作者
• e218edb10161:容器ID
• runoob/ubuntu:v2: 指定要创建的目标镜像名
• v2: tag
给镜像补打tag(版本号):# docker tag 860c279d2fec runoob/centos:dev
容器(Container)
查看本地正在运行容器:# docker ps
查看本地运行&&停止的所有容器:# docker ps –a
启动容器:
-d 应该是 daemon, 守护进程的意思。
-p 指定暴露容器内部端口给宿主机, -P随机暴露端口
交互模式
进入了个中端来进行交互, -i interaction, -t terminal.
#! /bin/bash linux的脚本解释器, 不带上他,执行了-it也没用
没有-d 退出就没了;
进入容器:
难免要主机和容器之间进行数据交换的, 所以得学会一个好用的技能cp
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
容器生命周期管理:
创建一个新容器,但是不运行
docker create [OPTIONS] IMAGE [COMMAND] [ARG…]
docker start [OPTIONS] CONTAINER [CONTAINER…]
docker stop [OPTIONS] CONTAINER [CONTAINER…]
docker restart [OPTIONS] CONTAINER [CONTAINER…]
容器其它命令:
打印日志:
查看端口
docker info [OPTIONS]
参考链接
Docker教程_菜鸟教程
Docker的好处_docker中文官网首页
Docker中文操作手册
实战Jepress博客系统
Jpress官网
用户 - tomcat Jpress app mysql
原生部署
tomcat, mysql的下载,安装,启动。
对Jpress工程编译war包,丢在tomcat/webapps目录下:
导入数据库脚本 mysql.sql到mysql数据库。
App配置文件修改:
starter-tomcat-1.0\WEB-INF\classes\jboot.properties
对齐数据库的用户名,密码
重启tomcat。
访问并查看博客列表:
http://localhost:8080/starter-tomcat-1.0/
Docker-compose
一个docker-compose.yml
一句命令:#docker-compose up –d
制作镜像
Docker commit
Web容器就能运行app了:
疑问:设置volumn后好像commit不生效?
将starter-tomcat-1.0.war包放在/E/DockerFiles/tomcat/webapps下,app就自动copy到容器去了。或者使用docker cp命令
提交到本地镜像仓库
重新运行之后,发现容器内却没有start-tomcat-1.0呢?
Docker build
Dockerfile:
FROM tomcat
COPY starter-tomcat-1.0.war /usr/local/tomcat/webapps
把这个镜像jpress_build也启动:
Docker进阶操作
镜像制作详解
Docker commit
很多时候自己对容器修改了,肯定要保存提交为镜像的
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
• -a :提交的镜像作者;
• -c :使用Dockerfile指令来创建镜像;
• -m :提交时的说明文字;
• -p :在commit时,将容器暂停。
镜像的保存:
从问文档中创建镜像
docker import tomcat.tar mytomcat:v2
Docker build && Dockerfile使用
FROM nginx
MAINTAINER shujun
RUN echo ‘
CMD /usr/sbin/nginx
Dockerfile 是用来修改并构建我们特定镜像的文本文件,类似于docker pull, 修改,然后docker commit.
分为四部分:基础镜像信息、维护者信息、镜像操作指令、容器启动执行指令。一开始必须要指明所基于的镜像名称,接下来一般会说明维护者信息;后面则是镜像操作指令,例如 RUN 指令。每执行一条RUN 指令,镜像添加新的一层,并提交;最后是 CMD 指令,来指明运行容器时的操作命令。
构建Dockerfiles
#docker build -t dockerfile_nginx:v1 .
-t参数指定构建成镜像的仓库、标签。
.表示当前目录
构建完成之后就会有dockerfile_nginx:v1了。
Docker-compose
组合容器的快速启动办法。
熟悉配置文件的基础写法…
Volume数据卷
独立于容器之外的永久性存储器。
Windows挂载不上?
原因是一定得写全绝对路径,而且window一定得设置密码
访问成功后,修改本地html里面的index.html文件,然后浏览器再次访问:
Docker网络与通信
我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:
· host模式,使用–net=host指定。
· container模式,使用–net=container:NAME_or_ID指定。
· none模式,使用–net=none指定。
· bridge模式,使用–net=bridge指定,默认设置。
a. Bridge模式
图中ens160是宿主机的ip地址,
http://localhost:8080/
http://10.0.75.1:8080/
为了直接和容器内部ip通信,添加路由映射:
http://172.19.0.3:8080/
不同宿主机之间容器通信:容器暴露端口后,宿主机之间的交互和常规应用一样,宿主机再各自通过网桥docker0和容器转换交互。
同一宿主机内部通信:
挂载在同一个网桥docker0下的容器可以直接ip通信,
为解决容器ip动态分配问题,使用 –link
在busybox2里面可以ping busybox1
查看’/etc/hosts’文件,我们可以看到Docker在busybox2容器中的主机条目中列入了busybox1的正确地址
b.Host模式
容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
Container模式
新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
None模式
Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
参考链接
一分钟看懂Docker的网络模式和跨主机通信_wuli潇潇_cnblogs
docker for windows 容器内网通过独立IP直接访问的方法_brock0624_cnblogs
docker中ping命令找不到—xrichardyan—简书
docker终极指南
Docker仪表监控
Docker.sock
https://gitee.com/helyho/DockerFly
dockerfly是一个网页版的docker管理工具 可以管理docker中 swarm、container、network、volume、image等。
docker run --name dockerfly -d --restart always -p 28083:28083 helyho/dockerfly
-v /var/run/docker.sock:/var/run/docker.sock
Unix domain socket和IP(tcp/ip) socket的区别_iengchen_简书
Unix domain socket 主要用于同一主机上的进程间通信。与主机间的进程通信不同,它不是通过 “IP地址 + TCP或UDP端口号” 的方式进程通信,而是使用 socket 类型的文件来完成通信,因此在稳定性、可靠性以及效率方面的表现都很不错。
Runtime.exec(commondStr)
java执行cmd命令并获取输出结果
Kubernetes
十分钟带你理解Kubernetes核心概念—dockone
K8s
Docker Swarm集群
…. 待续 ….
疑问:
Windows docker为啥老是端口有问题,要重启服务呢?
Windows Command && Windows Powershell的区别?
Httpd是干什么的?
疑问:设置volumn后好像commit不生效?
踩过的坑
Q: 镜像下载极慢
更换网易镜像: https://registry.docker-cn.com
Q: docker启动容器端口映射错误
报错: docker: Error response from daemon: driver failed programming external connectivity on endpoint pric
Solve: 网络又问题了吧,要重启windows docker;
Q: docker –v 没法挂载
Windows docker一定得设置密码,&& 绝对路径挂载
或者windows setting里面设置: