一、容器基本命令
新建容器并启动
docker run [可选参数] image
#参数说明
--name="Name" 容器名字
-d 后台方式运行
-it 交互方式运行,进入容器查看内容
-P(大写) 指定容器的端口
-P ip:主机端口:容器端口
-P 主机端口:容器端口
-P 容器端口
-p 随机指定端口
列出所有运行的容器
docker ps 列出当前正在运行的容器
#参数说明
-a 列出当前正在运行的容器+历史运行过的容器
-n=? 显示最近创建的容器
-q 只显示容器的编号
退出容器
exit #直接容器停止退出
Ctrl + p + q #容器不停止退出
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有的容器
docker ps -a -q|xargs docker rm #删除所有的容器
启动和停止容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
查看日志
docker logs -f -t --tail number 容器id
#参数说明
-f #显示日志
-t #显示时间戳
--tail number #显示日志条数
查看容器中进程信息
docker top 容器id
UID #当前用户id
PID #父id
PPID #进程id
查看容器的原数据
docker inspect 容器id
进入当前正在运行的容器
#方式一:请入容器后开启一个新的终端,可以在里面操作(常用)
docker exec 容器id bashShell
#方式二:进入容器正在执行的终端,不会启动新的进程
docker attach 容器id bashShell
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径
提交镜像
docker commit #提交容器成为一个新的副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[版本号]
二、容器数据卷
容器的持久化和同步操作,容器间也是可以数据共享的,Docker容器中产生的数据,同步到本地
好处:修改只需本地修改,容器内自动同步
使用数据卷
#方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
查看所有卷(volume)的情况
docker volume ls
具名&匿名挂载&指定路径挂载
#匿名挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /ect/nginx nginx
#具名挂载(常用)
-v 卷名:容器内路径
docker run -d -p --name nginx01 -v juming-nginx:/ect/nginx nginx
#指定路径挂载
-v /宿主机路径:容器内路径
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d mysql:tag
所有docker容器内的卷,没有指定目录情况下都在 /var/lib/docker/volumes/****/_data
实战:安装MySQL
#获取镜像
docker pull mysql:5.7
#运行容器,需要做数据挂载,安装启动mysql,需要配置密码
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d
-v /home/mysql/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=密码
--name 名字 mysql:tag
拓展
#通过 -v 容器内路径:ro rw 改变读写权限
ro readonly #只读(只能通过宿主机操作,容器内部无法操作)
rw readwrite #可读可写
docker run -d -p --name nginx01 -v juming-nginx:/ect/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx:/ect/nginx:rw nginx
两个或者多个容器之间数据共享
docker run -d -P 3310:3306 --name mysql02 --volumes-form mysql01 mysql:5.7
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
删除容器时持久到本地的数据不会删除
三、Dockerfile
DockerFile:构建文件,定义了一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品
Docker容器:容器就是为镜像运行起来提供的服务器
初识Dockerfile
# 创建一个dockerfile文件,名字可以随机,建议Dockerfile
# 文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
构建步骤
- 编写一个dockerfile文件
- docker build 构建成一个镜像
- docker run 运行镜像
- docker push 发布
Dockerfile指令说明
FROM #基础镜像,一切从这里开始构建(scratch)
MAINTAINER #镜像作者 姓名 + 邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOST #保留端口配置
CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令
RUN #运行
ONBUILD #当构建一个被继承DockerFile时运行ONBUILD指令(触发指令)
COPY #类似ADD,将文件拷贝到镜像中
ENV #构建的时候设置环境变量
Demo:创建自己的centos
- 编写Dockerfile文件(cat mydockerfile-centos)
FROM centos
MAINTAINER ma<111111@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yun -y install net-tools
EXPOSE 80
CMD echo $MPATH
CMD echo "----end----"
CMD /bin/bash
- 通过文件构建镜像
docker build -f dockerfile文件路径 -t 镜像名:[tag]
- 测试运行
实战:Tomcat镜像
- 准备镜像文件 tomcat压缩包,jdk压缩包
- 编写dockerfile文件
- 构建镜像(docker build -t diytomcat .)
- 启动镜像
- 访问测试
- 发布项目
FROM centos
MAINTAINER ma<111111@qq.com>
COPY readme.txt /usr/local/readme.txt
ADD jdk-8u11-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.22.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /user/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out
发布镜像-dockerHub
- 注册账号
- 服务器上提交自己的镜像
docker login -u username
docker push username/diytomcat:1.0
发布镜像-阿里云镜像
- 登录阿里云
- 找到容器镜像服务
- 创建命名空间
- 创建容器镜像
docker login --username=*** registry.cn-beijing.aliyuncs.com
docker push ***/tomcat1.0
四、Docker 网络
每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker就会有一个网卡docker0
桥接模式,使用的技术是evth-pair技术(一对虚拟设备接口,成对出现,一端连着协议,一端彼此相连)
docker所有网络接口都是虚拟的(转发效率高),只要容器删除,对应网桥就没了
查看容器内网络地址
ip addr
网络连通
--link #在hosts配置中增加了***的映射(不建议使用)
docker network connect NETWORK CONTAINER
自定义网络
#查看所有的docker网络
docker network ls
网络模式:
bridge : docker(默认)
none : 不配置网络
host : 和宿主机共享网络
container : 容器网络连通
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#参数说明
--driver bridge #桥接
--subnet 192.168.0.0/16 #子网地址
--gateway 192.168.0.1 #路由器地址