docker-mysql

Docker Note
Docker简介
是什么
应用容器,小型虚拟机(VMware)
不同之处:容器开销极低,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

Docker的优点。

  1. 继承了虚拟机的环境安全和隔离,简化配置。
  2. 可以打包成镜像,并分享,和项目协作。
  3. docker的自带仓库,集中解决了yum/apt 软件版本问题。
  4. 网络和软件,数据库负载均衡,高并发。
  5. 节约,和最大化使用服务器资源,数据库灾难备份。

使用场景
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

总结
网络损耗图

  1. 是没有docker的环境。
  2. 是host
  3. 容器通讯损耗较大。
  4. 总结:以往使用,需要折损12%网络性能。
    Docker 安装
    Window安装
    演示window 通常linux 中,apt/yum安装
    Win10 系统安装docker_菜鸟教程 (Win10下需要开启 Hyper-V)
    老方法,是否安装ok?看version

Hello World
第一个程序总是从HelloWorld开始…

docker run hello-world

hello-world是个镜像

Linux安装
apt-get install -y docker-ce

如果失败

官网说明文档安装
https://docs.docker.com/install/linux/docker-ce/debian/

Docker初体验
Lovely whalesay

docker run docker/whalesay cowsay hello funny

Ubuntu

docker run ubuntu:15.10 /bin/echo “Hello world”

界面直接输出了 “Hello World”
如果不写tag,15.10,则默认运行最新的。

Ubuntu图形化界面

docker pull dorowu/ubuntu-desktop-lxde-vnc

docker run -it --rm -p 666:80 dorowu/ubuntu-desktop-lxde-vnc

也可以使用命令(VNC Viewer设置密码):

docker run -p 6080:80 -e VNC_PASSWORD=mypassword dorowu/ubuntu-desktop-lxde-vnc

Nginx服务

docker run -p 80:80 –d nginx

docker cp index.html 3e4d2e2fd5f5677a8309b72e:/usr/share/nginx/html

已经启动,并修改了文件了:

如果不知道容器应用的端口,可以大P随机暴露端口

docker run -P –d nginx

Mysql

docker run -p 3307:3306 --name testmysql -v conf:/etc/mysql/conf.d -v logs:/logs -v data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

• -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 –h localhost –P 3307 –u root –p

回车 进入mysql数据库,可直接在-p后链接输入,如:-p123456,用户没有设置密码,显示Enter password时,直接回车即可。

其中-h表示服务器名,localhost表示本地,分开或者黏在一起写都可以(-hlocalhost, –h localhost);-u为数据库用户名,root是mysql默认用户名;-p为密码,如果设置了密码,

Tomcat使用

docker run --name docker-tomcat -p 8080:8080 -v webapps:/usr/local/tomcat/webapps/test -d tomcat

进入tomcat容器内部:

docker exec -it 839dd951308a /bin/bash

Python的使用

docker run -it python:3.7

Apache的使用

docker pull httpd

docker run -p 89:80 -v www/:/usr/local/apache2/htdocs/ -v conf/:/usr/local/apache2/conf/httpd.conf -v logs/:/usr/local/apache2/logs/ -d httpd

指定目录报错的,待解决:

docker run -p 88:80 -d httpd

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

启动容器:

docker run -d nginx

-d 应该是 daemon, 守护进程的意思。
-p 指定暴露容器内部端口给宿主机, -P随机暴露端口

交互模式

docker run -it ubuntu:15.10 /bin/bash

进入了个中端来进行交互, -i interaction, -t terminal.

#! /bin/bash linux的脚本解释器, 不带上他,执行了-it也没用
没有-d 退出就没了;

进入容器:

docker exec –it containerId bash

难免要主机和容器之间进行数据交换的, 所以得学会一个好用的技能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 logs –f tomcat

查看端口

docker port tomcatId||tomcatName

显示docker系统信息

docker info [OPTIONS]

参考链接
Docker教程_菜鸟教程
Docker的好处_docker中文官网首页
Docker中文操作手册

实战Jepress博客系统
Jpress官网
用户 - tomcat  Jpress app  mysql
原生部署

  1. tomcat, mysql的下载,安装,启动。

  2. 对Jpress工程编译war包,丢在tomcat/webapps目录下:

  3. 导入数据库脚本 mysql.sql到mysql数据库。

  4. 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

  1. 启动一个docker web容器:

docker run -p 8080:8080 -d tomcat

  1. 将war包copy到webapps目录下:

docker cp .\starter-tomcat-1.0.war bbbc5cf8a846:/usr/local/tomcat/webapps

Web容器就能运行app了:

  1. 提交容器

docker commit -m “commint jpress without volumn” -a “shujun” bbbc5cf8a846 jpress_commit_no_volumn:v1

  1. 推送到远端镜像仓库

docker push jpress_commit:v1

疑问:设置volumn后好像commit不生效?

docker run --name tomcat_volumn -p 8080:8080 -d -v /E/DockerFiles/tomcat/webapps:/usr/local/tomcat/webapps tomcat

将starter-tomcat-1.0.war包放在/E/DockerFiles/tomcat/webapps下,app就自动copy到容器去了。或者使用docker cp命令

docker cp /webapps/starter-tomcat-1.0.war tomcat_volumn: /usr/local/tomcat/webapps

提交到本地镜像仓库

docker commit -m=“create image for jpress app” -a=“shujun” fd96b688c97b jpress_commit:v1

重新运行之后,发现容器内却没有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 save -o tomcat.tar tomcat:latest

从问文档中创建镜像
docker import tomcat.tar mytomcat:v2
Docker build && Dockerfile使用

1、第一行必须指定 基础镜像信息

FROM nginx

2、维护者信息

MAINTAINER shujun

3、镜像操作指令

RUN echo ‘

Hello, Docker!

’ > /usr/share/nginx/html/index.html

4、容器启动执行指令

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数据卷

独立于容器之外的永久性存储器。

  1. docker inspect, 然后可以找到那个mountes路径,看到容器的路径是挂载在宿主机上的什么位置。
  2. 运行的时候指定宿主机的挂载路径:

docker run –d –v html:/usr/share/nginx/html –p 80:80 nginx

Windows挂载不上?
原因是一定得写全绝对路径,而且window一定得设置密码

docker run –d –v /e/DockerFiles/nginx/html:/usr/share/nginx/html –p 80:80 nginx

访问成功后,修改本地html里面的index.html文件,然后浏览器再次访问:

  1. Docker –volumns命令

Docker网络与通信
我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:
· host模式,使用–net=host指定。
· container模式,使用–net=container:NAME_or_ID指定。
· none模式,使用–net=none指定。
· bridge模式,使用–net=bridge指定,默认设置。

a. Bridge模式

  1. 主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
  2. 接下来就要为容器分配IP了,Docker会从RFC1918所定义的私有IP网段中,选择一个和宿主机不同的IP地址和子网分配给docker0,连接到docker0的容器就从这个子网中选择一个未占用的IP使用。如一般Docker会使用172.17.0.0/16这个网段,并将172.17.42.1/16分配给docker0网桥。
  3. 每个容器都有自己的独立的ip和端口,通过docker0进行转换。容器内部ip和端口默认无法访问,需要通过暴露端口给外部访问。

图中ens160是宿主机的ip地址,

http://localhost:8080/
http://10.0.75.1:8080/

为了直接和容器内部ip通信,添加路由映射:

route -p add 172.19.0.0 MASK 255.255.255.0 10.0.75.2

route print

http://172.19.0.3:8080/

不同宿主机之间容器通信:容器暴露端口后,宿主机之间的交互和常规应用一样,宿主机再各自通过网桥docker0和容器转换交互。

同一宿主机内部通信:
挂载在同一个网桥docker0下的容器可以直接ip通信,
为解决容器ip动态分配问题,使用 –link

Docker run --name busybox1 -p 8080:8080 -it busybox

Docker run --name busybox2 --link busybox1:busybox1 -it busybox

在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里面设置:

你可能感兴趣的:(docker-mysql)