Docker
docker的基础使用
为什么会出现docker
-
docker可以将在开发时的环境和产品全部打包成一个镜像,直接将这个镜像发给运维人员部署即可,不会在出现在我这边能运行,在运维那边不能运行的情况
-
打包成镜像后,可以上传到docker hub,需要使用的人可以从上面下载,即可使用
-
Docker的思想来源于集装箱
docker的一些常用的命令
docker的基础命令
- docker version
- docker info:查看docker系统信息如镜像数量和容器数量
- docker 命令 --help:可以列出该命令的所有可选项
docker镜像命令
-
docker images:查看镜像
-
docker images -a :查看所有的镜像
-
docker images -q:只列出镜像的id
-
docker images -aq:列出所有镜像的id
-
tag:镜像的版本 imageid:镜像的id create:镜像的创建时间 size:镜像的大小 reposity:镜像的仓库源
docker容器命令
- docker ps:查看正在运行的容器
- docker ps -a:查看所有运行过的和正在运行的容器
- docker ps -q:查看容器的id
- docker ps -aq:查看所有运行过和正在运行的容器id
删除镜像
- docker -rmi 镜像id
- docker -rmi -f镜像id
- docker -rmi -f $(docker images -aq):删除所有镜像
删除容器
- docker -rm 容器id
- docker -rm -f 容器id
- docker -rm -f $(docker ps -aq):删除所有的容器
拉取镜像
- docker pull 镜像id:版本:如果不指定版本默认下载最新版
搜索镜像
- docker search 镜像:版本
- docker search 镜像 --filter stars=3000:用filter删选出stars大于3000的指定的镜像
运行容器
- docker run 镜像id
- -it:以交互模式运行
- -e:指定环境
- -d:后台运行
- --name:为容器指定名字
- -p 宿主机ip 宿主机端口:容器端口:将指定容器端口映射到宿主机指定端口上
- -p 宿主机端口:容器端口:将指定容器端口映射到宿主机指定端口上
- -p 容器端口
- 如:docker run -it --name:mysql80 -p 3306:3306 -e MYSQL_ROOT-PASSWORD=123 -d mysql:8.0
- 指定mysql的密码为123 容器名为mysql80 容器中的3306映射到宿主机3306 在后台运行
进入容器
- docker exec -it 容器名或者容器id /bin/bash:从新开出一个工作界面进入容器
- docker attach 容器名或者容器id:与上者相反
容器的停止与启动
- docker stop 容器id
- docker start 容器id
- docker restart 容器id
- docker kill 容器id :强行终止指定容器
从容器内部拷贝东西到宿主机上
- docker cp 容器id:文件路径 宿主机路径
查看容器内的进程信息
- docker top 容器id
查看容器的元数据
- docker inspect 容器id
查看docker的数据卷
- docker volume ls
- docker volume inspect 数据卷名:docker数据卷的具体信息
- docker volume create 数据卷名:创建自己的数据卷
容器数据卷
宿主机数据卷
- 通过-v选项实现容器内部指定路径的目录的数据同步到宿主机上的指定目录
- docker run -v /usr/lib/test:/usr/lib/mysql:rw mysql:8.0通过-v实现mysql的数据持久化到宿主机上面,即使容器被删除,数据依然在
- 对于宿主机或者容器数据同步的目录可以原来不存在,在容器启动的时候可以自动创建指定的目录
- 对于rw:含义是对于容器来说容器内部的/usr/lib/mysql文件是可读可写的,如果改为ro是只读,两种情况对于宿主机都是可读可写
具名数据卷
- 通过-v选项实现docker目录下的volume下的指定名字数据卷和容器类指定的目录数据同步
- docker run -v mysqlvolume:/usr/lib/mysql mysql:8.0
- 容器启动后会在宿主机/var/lib/docker/volumes目录下面新建一个名字为mysqlvolume的数据卷,并与容器中的指定目录数据同步
匿名数据卷
- 通过-v选项实现docker目录下的某个数据卷和容器内的指定目录的数据同步
- docker run -v /usr/lib/mysql mysql:8.0
- 与具名数据卷一样,只不过名字随机
以上三种方法都可以实现宿主机和容器之前的数据同步与持久化
宿主机与容器实现数据同步
- 使用以上的三种方法中的其中一种即可
容器与容器之间实现数据同步与共享(在集群的时候可以用到)
-
使用dockerfile文件生成带有数据卷的镜像或者在启动容器的时候使用--volume myvolume为容器创建了myvolume数据卷,然后使用--volume-from 容器id选项来实现容器之间的数据共享
-
docker run -d -it --name ubuntu1 --volume myvolume ubuntu /bin/bash #创建一个带有myvolume数据卷的ubuntu系统 docker run -d -it --name ubuntu2 --volumes-from ubuntu1 ubuntu /bin/bash #在次创建一个ubuntu系统,此时这个系统关联了ubuntu1容器的myvolume数据卷,所以在他的目录下也会有一个myvolume目录用于实现两个容器之间的数据同步与共享
Dockerfile文件详解
-
FROM:基础镜像 RUN:构建镜像的时候需要运行的命令 ADD:添加压缩包到指定的容器目录下并自定解压 COPY:复制文件到指定的容器目录下 CMD:指定容器启动时候需要运行的命令,可以替代 ENTRYPOINT:和cmd一样,可以追加,不可替代 ENV:构建镜像的时候设置环境变量 MAINTAINER:添加作者信息 WORKDIR:指定容器启动进去是的目录 VOLUME:创建数据卷 EXPOSE:需要暴露的端口 ONBUILD: -
使用Dockerfile来构建一个带有vim和ifconfig命令的ubuntu系统
-
FROM ubuntu RUN apt-get update RUN apt-get -y install vim RUN apt-get -y install net-tools CMD /bin/bash #在以交互模式启动容器的时候可以不用在后面添加/bin/bash
-
-
cmd和entrypoint的区别
- cmd命令在容器启动的时候追加命令的时候,会直接替换掉构建镜像时候的cmd
- entrypoint命令在容器启动的时候追加命令的时候,会直接在构建镜像的时候的entrypoint命令后面追加命令
使用dockerfile来构建一个包含jdk8和tomcat的镜像
-
Dockerfile
-
FROM ubuntu MAINTAINER CLT<3101728477@QQ.COM> ADD apache-tomcat-9.0.72.tar.gz /usr/local/ ADD jdk-8-linux-x64.tar.gz /usr/local/ WORKDIR /usr/local ENV JAVA_HOME /usr/local/jdk1.8.0_301 ENV CLASS_PATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.72 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.72 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib;$CATALINA_HOME/bin EXPOSE 8080 CMD echo "---start---"
-
-
将容器启动访问localhost:8080可以访问成功
将自己的镜像提交到docker hub
- 注册dockerhub账号
- docker loing -umrclt -p密码 登录dockerhub
- docker tag 镜像名 mrclt/镜像名:将镜像归属到自己的账户下
- docker push mrclt/镜像名:提交镜像
docker网络
实现同一个网络容器之间的通信
- 使用ip addr可以查看到docker0和其他容器的虚拟网卡
docker的同一个网络的容器之间可以互相ping通
- 原理:
- 在容器启动的时候,如果使用--network选项指定那个网络的话,默认使用docker0网卡(172.17.0.0/16)来给容器分配ip地址,同一个网络启动的容器之间可以ping通
- 172.17.0.0/16中的16代表从ip地址的二进制开头截取到16位,也就是172.17,那么这个网络最多可以分配255*255个ip
- 在容器启动的时候,docker都会利用veth-pair技术产生一对一对的虚拟网卡,用来实现容器与docker0的通信,而docker0相当于一个桥梁,可以实现容器与容器之间通过docker0来通信
使用docker0来充当网卡分配ip
- 同一个网络的容器与容器之间可以通过ip地址ping通,但是不可以动过容器名来ping通,这是docker0网络的局限性
使用自定义网络来充当网卡分配ip
-
docker network create --driver bridge --subnet 192.168.0.0/16 --gageway 192.168.0.1 cltnet 命令创建cltnet网络
-
在容器启动的时候指定网络为cltnet来分配ip,这样就可以通过容器名或者容器id或者ip地址来通信了
-
docker run -it -d --name ubuntu --network cltnet ubuntu /bin/bash
-
实现不同网络容器之间的通信
- 原理:
- 现有两个容器ubuntu1(172.17.0.2)和ubuntu2(192.168.0.3)ip地址处于不同网络,如果ubuntu1想要连接ubuntu2,则直接在ubuntu1中虚拟一个和ubuntu2同一个网络的网卡,即可实现ubuntu1ping通ubuntu2,相同的,ubuntu2也可以使用同样的方式来ping通ubuntu1,以此实现不同网络容器之间的通信。
实现:
- docker network connect cltnet ubuntu1:实现ubuntu1ping通ubuntu2
- docker network connect docker0 ubuntu2: 实现ubuntu2ping通ubuntu1
- 至此ubuntu1和ubuntu2两个处于不同网络的容器即可实现网络通信
浙公网安备 33010602011771号