一.docker概述
docker为什么出现
本机和上线环境会完全一模一样的一致吗?
很难,且如果项目版本更新,我本机上的和上线的又能保持完全一模一样的一致吗?
比如我在windows上开发了一个jar+redis+es等等一系列,准备部署上线,我还需要在上线环境上部署吗?
docker为我们提供了一个解决这些所有问题的答案,即docker运用虚拟化技术通过模拟运行在一个完全隔离环境中的完整计算机系统
二.docker安装
1.基本组成
1.image镜像
是一个模板,我们可以通过模板构造出任意我们想要的容器环境
2.container容器
装镜像的壳子,相当于一个运行的系统
3.repository仓库
存放镜像的地方
2.docker安装
1.教程
https://cloud.tencent.com/document/product/213/46000
2.加速
vi /etc/docker/daemon.json
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
3.搭建
docker run -d -p 90:80 nginx
-d放入后台,-p端口映射,nginx镜像名称
访问本机90端口即可看见环境搭建完成
三.docker相关命令
1.常用命令
docker image 查看镜像 docker pull 下载镜像 docker rmi 删除镜像 docker ps 列出运行容器 docker rm 删除容器 docker stop 暂停容器 docker start 启动容器
导出镜像
[root@docker01 ~]# docker image list REPOSITORY TAG IMAGE ID CREATED SIZE centos latest ff426288ea90 3 weeks ago 207MB nginx latest 3f8a4339aadd 5 weeks ago 108MB # 导出 [root@docker01 ~]# docker image save centos > docker-centos.tar.gz
导入则用load命令
docker image load -i docker-centos.tar.gz
如何使export就对应用import,只是对应不是容器罢了,而是镜像
进入容器
docker run -it #参数:-it 可交互终端
2.挂载卷
挂载时可以使用同一个卷
docker run -d -p 90:80 -v /data:/usr/share/nginx/html nginx:latest
echo "hacked by guyue" >/data/index.html
3.创建镜像
启动一个镜像
比如debian10.5
[root@docker01 ~]# docker pull debian:19.5 [root@docker01 ~]# docker run -it -p 99:22 debian:19.5 /bin/bah
在容器内修改账号密码,并且自动启动ssh服务
yum install openssh-server -y echo "root:xxx" |chpasswd /etc/init.d/sshd start
并且安装httpd服务
yum install httpd -y
编写启动脚本
#!/bin/bash /etc/init.d/httpd start /usr/sbin/sshd -D 比如,init.sh
提交其为新的镜像
docker commit 5b8161fda2a9 centos6-httpd
docker run -d -p 99:22 -p 80:80 centos6-httpd /init.sh 46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c
自启动
当然这里推荐最好分层
4.dockerfile自动构建docker镜像
我们在docker pull的时候会看到不同的一层层的镜像正在拉取
比如如果加载的是linux环境,加载的第一层会是bootfs文件系统,包含内核和boot,然后一层层添加,比如第二层就是加rootfs,包含的各种命令
像是这样
除此之外,已拉取的镜像是不可写的,而容器是可写的,因为不同的容器可能会用的相同的镜像
FROM # 基础镜像,一切从这里开始构建 MAINTAINER # 镜像是谁写的:姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤:tomcat镜像,这个tomcat压缩包!添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录 EXPOSE # 暴露端口配置 CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令 ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD的指令。触发指令。 COPY # 类似ADD,将我们文件拷贝到镜像中 ENV # 构建的时候设置环境变量!
比如我们这样写一个
# 创建一个dockerfile文件,名字可以随机,建议dockerfile # 文件中的内容:指令都是大写 FROM centos VOLUME ["volume01","volume02"] CMD echo "-----end-----" CMD /bin/bash MAINTAINER yueji0j1anke # 这里的每个命令,就是镜像的一层。
然后
docker build -f ./dockerfile01 -t guyue.centos .
可以看到我们挂载的两个目录
查看一下路径即可
docker inspect id
同步成功
除此之外,多个mysql可以实现数据共享
docker run -d -p 7777:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7 docker run -d -p 7777:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
两个容器中的数据实现同步
这里需要讲一讲cmd和entrypoint的区别
cmd是容器启动要执行的命令
entrypoint可以累加
四.docker网络
1.自创网卡
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
启动时使用该网卡
docker run -d -P --name tomcat-net-02 --net mynet tomcat:7.0
2.网络联通
跨网卡操作
docker network connect name name
五.创建一个docker仓库
docker run -d -p 5000:5000 --restart=always --name yuejinjianke -v /opt/myregistry:/var/lib/registry registry
修改配置文件,使其支持http
[root@docker01 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"], "insecure-registries": ["10.0.0.100:5000"] }
restart docker
上传即可
[root@docker01 ~]# docker push 10.0.0.100:5000/clsn/busybox
更多详情
https://cloud.tencent.com/developer/article/1885678