如何理解docker?
通过镜像模版来快速部署和生成相同类型的VM。docker的image也是一个道理,通过不同类型的模版,比如redis镜像、nginx镜像来快速创建出容器。好比复制克隆,只要资源够,想生成多少就多少。生成出新的容器你可以使用,然后到时候你又可以打包成镜像。有了镜像这个功能,为生产提供了很好的打包、迭代、传递方式。容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象。
流程:创建容器—》进入容器—》更新系统容器的软件源—》下载资源(python,django等)—》commit创建上传镜像—》打包压缩新的镜像资源—》上传到线上服务器—》实现共享
先修知识:
service firewalld stop # 立马关闭防火墙
systemctl disable firewalld #设置firewalld开机不启动
setenforce 0 #临时关闭selinux
iptables -L #重新去添加docker自定义链在iptables里
iptables -L -t nat -n
systemctl start mysql #启动mysql服务
service mysql status #查看MySQL的详细信息
systemctl enable mysql #设置mysql开机启动
service mariadb stop #关闭mariadb服务
ss -anplut|grep mysql #查看详细信息
systemctl start nginx #启动nginx
yum install lrzsz -y #网页上传图片时要用到
find / -type s -name "mysql.sock" # 文件sock只能实现同一台机器上的不同的进程之间通信
mysql -uroot -p -h 192.168.0.8 #连别人机器上的MySQL
#网络socket ip:port可以实现不同机器上的不同的进程之间通信
-p 做端口映射的时候,其实背后就是在iptables里添加DNAT和SNAT策略
docker中镜像(image)的相关操作:
service docker start #开启docker服务[stop|retart]
docker images [docker image is] #查看所有镜像
docker search 镜像名 #查找镜像版本
docker pull 镜像名[可指定版本] #拉取镜像
docker rmi [docker image rm] 镜像名 #删除镜像
docker tag 旧名字 新名字 #镜像重命名
#docker tag djange_11:latest[版本号] django:latest
#此时会增加一个django的镜像,把原本删除就可以了
docker images history 镜像名 #查看某镜像的历史操作
docker image inspect 镜像名 #查看镜像的详细信息
docker save -o 压缩包名 镜像名 #打包压缩某镜像
#docker save -o ubuntu.tar ubuntu
#将ubuntu打包压缩成ubuntu.tar
docker load -i 压缩包名 #导入镜像
docker export -o sc-ubuntu2.tar ubuntu-liu-4(新)
#导出镜像
静态:存放的镜像: docker save ---》docker load
动态:运行在容器里的镜像:docker export --》docker import
#docker load -i ubuntu.tar
#导入ubuntu.tar这个镜像
docker的容器操作:
service docker start #开始运行容器
service docker stop #停止运行容器 (关闭docker,里面的容器都会停止运行)
docker container ls #查看正在运行的容器【docker ps -a】
docker rm [-f 强制删除] #删除容器
docker ps -a -q #获取所有容器的id
#docker rm -f $a [$(docker ps -a-q)]
docker logs myuuu #查看日志,为什么没有启动
docker container inspect 容器名 #查看容器详情
docker container stats 容器名 #查看状态信息内容(CPU,内存等)
docker run -dit --name 容器名 镜像资源 /bin/bash #创建并运行容器
#docker run -it --name myu ubuntu /bin/bash #创建ubuntu镜像的容器(myu)
#[-d 守护进程模式(后台运行)]、[-it 交互模式]
#[-name 指定容器名,不加系统随机分配][/bin/bash 指定解释器(可运行ls等)]
docker exec -it 容器名 /bin/bash #交互式进入上面那个守护进程的容器
exit 或ctrl+d #退出容器 [若是守护进程模式,退出容器仍运行]
docker commit -m '改动信息' -a "作者信息" 容器名 新的镜像名 #将容器打包成新的镜像资源
#-m -a是选项,可省略
#容器的几种状态:up\create\stop
进阶:
docker create --name sc-1 -v /web:/usr/share/nginx/html:ro -p 8081:90 daocloud.io/nginx #创建一个静态容器
docker run --name sc-nginx-1 -v /web:/usr/share/nginx/html:ro -d -p 8080:80 daocloudi.o/nginx #创建并启动一个容器
docker run --name sc-mysql-1 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
-e 宿主机往容器里传递环境变量 environment
MYSQL_ROOT_PASSWORD 是变量名
my-secret-pw 变量的值
mysql -h 192.168.0.17 -uroot -psc123456
访问容器(可以是其他的机器)
-h 指定连接服务器的ip地址
项目部署:
流程图
容器的创建与运行
容器的下载与运行
#我要把我的项目部署在哪个系统上? Ubuntu
#拉取Ubuntu的镜像资源拉取下来
docker image pull ubunt
#运行一个Ubuntu的容器 使用的是Ubuntu镜像资源
docker run -it --name myu ubuntu /bin/bash
#更新系统容器的软件源
apt update
#安装我们想要的资源【在系统容器中配置项目依赖环境】
apt install python3-pip #python3的安装工具
#安装django [基于python上]
pip3 install django==1.11.11
#查看我们安装的所有模块
pip3 list
#将项目文件上传到系统容器中
#将我们部署好的容器压缩成镜像资源
docker commit mydjango mydjango #[容器名] [镜像资源名(可以起新的名字)]
#进行线上部署,将我们做好的镜像资源打包压缩
docker save -o mydjango.tar mydjango
#将压缩好的文件上传到远程服务器上
#将资源传递到192.168.0.17这台服务器上
scp sc-ubuntu.tar root@192.168.0.17:/root
#运行服务进行解压导入
docker load -i mydjango.tar
#启动
docker run -dit --name django --network=host /bin/bash
#[--network 指定网络]
#进入容器后台
docker exec -it django /bin/bash
#容器和线上服务器共享网卡信息
#服务在容器中运行的,那我们就可以通过网站访问容器的内容
补充:容器上不了网—》要开启路由功能:
echo 1 >/proc/sys/net/ipv4/ip_forward #临时开启
vim /etc/sysctl.conf ---》输入:net.ipv4.ip_forward = 1 #永久开启
service docker restart 重启docker ,会到iptables里去添加相关规则
数据卷:将宿主机的某个目录,映射到容器中,作为数据储存,我们就可以对宿主机的数据进行储存
docker run --help [-v 共享一个数据卷]
docker volume ls #查看所有卷
docker volume inspect 容器名字 #查看某卷的详细信息【路径】
/var/lib/docker/volumes #存放所有数据卷的文件
例:这个例子中zjh就是一个数据卷
#先创建一个目录
mkdir zjh #把这个作为映射目录
docker run -it -v ~/zjh:/home ubuntu /bin/bash #将~下的zjh映射到/home
#此时创建完毕,在另一个终端对zjh进行操作,容器这边也会相应改变,反之~
docker run -it --name myuu -v ~/zjh:/home ubuntu /bin/bash #映射到另外一个容器
例:基于数据卷容器
#先创建一个模板容器,并在容器中的根目录下创建文件
docker create --name zhu -v /data ubuntu #这个模板容器说在Ubuntu条件下创建的
#使用这个容器
docker run -it --volumes-from zhu --name myaaa.1 ubuntu /bin/bash
docker run -it --volumes-from zhu --name myaaa.2 ubuntu /bin/bash
docker run -d --name fan-nginx-1 --mount source=sc,target=/usr/share/nginx/html -p 7790:80 nginx:latest
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
练习:
1.创建一个卷: sanchuang,在sanchuang卷里创建一个index.html首页文件,内容welcome to sanchuang
2.创建2个容器名字自己定义:rose-1 rose-2,启动nginx,使用sanchuang这个卷
#创建卷,并且往卷里新建文件index.html
docker volume ls #查看数据卷和数据卷容器
docker volume rm 数据卷 #删除数据卷
docker volume create sanchuang #创建sanchuang卷
docker volume inspect sanchuang #查看卷的详细信息
#"Labels": {},
#"Mountpoint": "/var/lib/docker/volumes/sanchuang/_data",
#"Name": "sanchuang",
cd /var/lib/docker/volumes/sanchuang/_data/ #进入数据卷
vim index.html --》welcome to sanchuang #创建一个index.html首页文件
docker run -d --name rose-nginx-1 -p 6688:80 --mount source=sanchuang,target=/usr/share/nginx/html nginx #启动第一个容器使用卷
docker run -d --name rose-nginx-2 -p 6689:80 --mount source=sanchuang,target=/usr/share/nginx/html nginx #启用第二个容器使用卷
docker ps #查看进程
docker仓库
Docker的仓库有三大类:
公有仓库:Docker hub、Docker cloud、等
私有仓库:registry、harbor等
本地仓库:在当前主机存储镜像的地方
和仓库相关的命令:
docker login [仓库名称]
docker pull [镜像名称]
docker push [镜像名称]
docker search [镜像名称]
实施方案
#下载镜像
docker pull redis
#启动容器
docker -d -p 5000:2233 regidtry
#检查容器效果
curl ip地址:端口号
#查看容器内部运行
docker top
#重启docker服务
systemctl restart docker
systemctl status docker
**部署基于192...这个局域网的私有仓库**:
```python
#将网络改为桥接模式
#下载私有仓库registry这个镜像资源
docker pull registry
#切换到root目录下(su root)
#进入/ect/docker/打开daemon.json这个文件
vim deamon.json--->insecure-registries:["私有网址:192.168.132.153:20"]
#重启docker服务
service docker restart
docker run -d myuuu #运行私有仓库myuuu
docker tag ubuntu 192.168.132.153:20/ubuntu #重命名
docker push 192.168.132.153:20/ubuntu #上传资源
docker pull 192.168.132.153:20/ubuntu #拉取资源
端口映射:要有映射端口才能上网,网址才能打开
桥接模式:同一个局域网可以相互通信
docker run -dit -P --name myn111 nginx [-P 随机分配IP地址和端口]
docker run -dit -p 8000:80 --name mybbb nginx [-p 指定8000端口映射到80]
#此时网址要指定端口:8000
docker run -dit -p 192.168.153.132:8000:80 nginx #按照指定IP进行映射
docker run -dit -p --name myn222 192.168.153.132:80:80 nginx #此时不用特意指定端口号了