狂神的笔记更加系统详细,推荐大家可以去看狂神的视频教程和笔记。我这里仅根据我自己的需求写的笔记,对于需要快速掌握docker的使用的朋友可以参考学习。
Docker 背景需求
之前,开发一套环境,上线一套环境,环境配置十分麻烦。那么,就有一个美好的希望:发布一个项目时,能够带上环境。
Docker思想
来自于集装箱,具有隔离性!
容器技术
在容器技术出来之前,是使用虚拟机技术,笨重!
- vm: linux centos 原生镜像(一个电脑)隔离,需要开启多个虚拟机。
- docker: 隔离,镜像(最核心的环境4M+jdk+mysql),运行镜像就可以了,小巧!
镜像( image ) : docker镜像好比一个模板,可以通过这个模板来创建容器服务,例如:Tomcat镜像—>run----->tomcat容器(提供服务器),通过这个镜像可以创建多个容器(服务/项目运行就是在容器中)
容器(container)docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建(有启动,停止,删除等命令)
仓库(repository),公有,私有仓库
Docker安装
docker命令
systemctl start docker 启动docker
docker version 查看版本
docker images 显示镜像有哪些
docker info 显示docker的系统信息,包括镜像和容器数量
docker --help 万能帮助文档
镜像命令
docker images -q 只显示镜像id
docker search 搜索镜像
docker pull mysql 下载镜像
docker rmi -f $(docker images -aq) 删除镜像
docker rmi -f ***
容器的命令
有了镜像才可以创建容器。
docker run [参数] 镜像 新建容器并启动
参数说明:
--name = 'xxx' 容器名字
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器端口:-p 8080:8080
-P 随机指定端口
exit 停止容器并退出
ctrl+p+q 不停止退出
docker ps 查看正在运行的容器
docker ps -a 列出所有运行的容器+曾经运行的容器
docker -q 只显示容器编号
删除容器
docker rm 容器id
docker rm -f $(docker ps -aq) 删除所有容器
启动和停止容器的操作
docker start 容器id
docker restart
docker stop
docker kill
docker run -d 镜像名 #后台启动容器,容器启动后,发现自己没有提供服务,就会立刻停止。
docker logs -tf --tail lo 容器id # 查看日志
ps 查看容器中进程信息
docker top 容器id
docker inspect 容器id 查看镜像元数据
进入当前正在运行的容器
docker exec -it 容器id /bin/bash
docker attch 容器id
从容器内拷贝文件到主机
docker cp 容器id:容器内路径 目的主机路径
练习:docker 部署 nginx
docker pull nginx #从仓库下载nginx镜像
docker images # 查看镜像列表
docker run -d --name nginx-01 -p 3344:80 nginx # 用nginx镜像创建名字为nginx-01的容器,并后台运行,设置宿主机端口:容器内部端口 3344:80
docker ps #查看
curl localhost:3344 #本机查看url端口号
docker exec -it nginx-01 /bin/bash #进入容器
whereis ngnix
cd /etc/nginx
ls
练习:docker 部署 tomcat
docker pull tomcat:9.0 从仓库下载镜像
docker images 查看镜像
docker run -d -p 3355:8080 --name tomcat01 tomcat 创建并运行容器
docker exec -it tomcat01 /bin/bash 进入容器
可视化
portainer, docker的图形化界面管理工具。提供一个后台面板使用。
下载:
docker run -d -p 8088:9000 restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
docker镜像
镜像,是一种轻量级,可执行的独立软件包,包含运行某个软件所需要的所有内容。
如何得到镜像:
- 从远程仓库下载
- 朋友拷贝
- 自己制作一个镜像 dockerfile
docker镜像加载原理
unionFS(联合文件系统)是docker镜像的基础,镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统unionFS。
分层理解
docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部! 这一层就是我们通常说的容器层,容器之下的都叫镜像层。
在这里插入图片描述
提交镜像
docker commit -m=“提交的描述信息” -a=作者 容器id 目标镜像名:tag
例子:
docker run -it -p 3355:8080 tomcat 运行tomcat镜像
docker exec -it 容器id bin/bash 进入容器
做一些修改操作
docker commit -a="lulu" -m="add webapps app" 容器id tomcat02:1.0 将更改后的容器通过commit 提交为一个镜像
容器数据卷
需求背景:数据可以持久化,不再随着容器删除而丢失!
容器之间可以有一个数据共享的技术,docker容器中产生的数据同步到本地,这就是卷技术!
目录的挂载,将容器内的目录,挂载到linux上面,实现同步。
使用数据卷
方式一:直接使用命令来挂载(手动挂载)
docker run -it -v 主机目录:容器内目录 镜像名 /bin/bash
具名挂载 匿名挂载 指定路径挂载
-v 容器内路径! #匿名
-v 卷名:容器内路径 #具名
-v /宿主机路径::容器内路径 #指定路径挂载
练习:mysq同步数据
docker pull mysql:5.7 获取镜像
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASS WORD=123456 --name mysql01 mysql:5.7 运行容器,需要做数据挂载,且mysq需要配置密码
Dockerfile
dockerfile 就是用来构建docker镜像的构建文件,即命令脚本。dockerfile是面向开发的,我们以后要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单!
dockerfile:构建文件,定义了一切的步骤,源代码
dockerImages:通过dockerfile构建生成的镜像,发布/运行的产品。
docker容器:镜像运行起来提供服务器。
dockerfile方式构建步骤:
- 编写一个dockerfile文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布镜像到仓库(DockerHub,阿里云等)
dockefile指令:
FROM 基础镜像,一切从这里开始
MAINTAINER 镜像是谁写的,姓名+邮箱
RUN 镜像构建时需要运行的命令
ADD 步骤
WORKDIR 镜像的工作目录
VOLUME 挂载的目录
EXPOSE 保留端口设置
CMD 指定容器启动时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT 可追加命令
ONBUILD 当构建一个被继承dockerfile ,就运行
ENV 构建的时候设置环境变量
dockerfile语法要求:
每个关键字必须大写
每一个指令都会创建提交一个新的镜像层,并提交!
方式二:在dockerfile中 自动挂载数据卷
mkdir docker-test-volume
vim dockerfile1 #创建一个dockerfile文件,文件中的内容:指令参数
docker build -f /home/docker-test-volume/dockerfile1 -t kuangshen/centos:1.0 #构建镜像
docker run -it 镜像id /bin/bash #运行镜像
Dockerfile实战
创建一个自己的centos
- 编写dockerfile文件:mydockerfile
FROM centos
MAINTAINER lulu<123.qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo 'end........'
CMD /bin/bash
- 根据编写的dockerfile文件,构建镜像
docker build -f mydockerfile -t mycentos:0.1
- 基于镜像创建启动容器
docker run -it mycentos:0.1
制作tomcat镜像
- 准备镜像文件 tomcat压缩包,jdk压缩包
- 编写dockerfile文件,官方命名为‘Dockerfile’,build会自动寻找到这个文件
FROM centos
MAINTAINER lulu<123.qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-***.tar.gz /usr/local/
ADD tomcat***.tar.gz /usr/local/
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk.8.0_11
ENV CLASSPATH $JAVA_HOME /lib/
ENV CATALINA_HOME /USR/LOCAL/
ENV CATALINA_BASH
ENV PATH
RUN yum -y install vim
EXPOSE 8080
CMD /usr/local/apache-tomact-9.0 /bin/startup.sh && tail -F
- 构建
docker build -t diytomcat
- 启动
docker run -d p 9090:8080 --name lulutomcat -v /home/lulu/ : /url/local/
- 访问测试
curl localhost 9090
-
发布项目(由于做了卷挂载,我们直接在本地编写项目,就可以发布了)
-
发布自己的镜像到仓库
Docker网络
理解docker0
linux 可以ping通docker容器内部,容器之间可以互ping通docker会给容器分配ip,docker有一个docker0网卡桥接模式,evth-pair技术,一对虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连,连接各种虚拟设备.
容器互联 --link (可以通过容器名互联)
–link 就是在hosts配置中增加了一个映射
docker run -d -p --name tomcat03 --link tomcat01 tomcat
docker exec -it tomcat03 ping tomcat02
自定义网络
docker network ls
网络模式
bridge 桥接
none 不配置网络
host 和宿主机共享网络
container 容器网络连通
docker0 特点,默认,域名不能访问,–link 可以打通连接!
可以自定义一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --getway 192.168.0.1 mynet
docker network inspect mynet #查看自己的网络
docker run -d -p --name tomcat-net-01 --net mynet tomcat
docker exec -it tomcat-net-01 ping tomcat-net-02
可以ping通
即自定义的网络,其包含的容器之间可以可以通过名字来ping通。
网络连接 : docker0 ,mynet
docker network connect mynet tomcat01
可以连通,原理:将tomcat01 放到了mynet网络下,一个容器两个ip地址。