一.docker常用命令
1.帮助启动类命令
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动:systemctl enable docker
查看docker概要信息:docker info
查看docker总体帮助文档:docker --help
查看docker命令帮助文档:docker 具体命令 --help
2.镜像命令
列出本地主机上的镜像:docker images
列出本地所有的镜像(含历史映像层):docker images -a
只显示镜像id:docker images -q
查询某个镜像:docker search 镜像名称
只列出N个镜像,默认25个:docker search --limit 5 redis
拉取某个镜像:docker pull mysql:5.6
查看镜像/容器/数据卷所占的空间:docker system df
删除镜像:docker rmi 镜像id
强制删除:docker rmi -f 镜像id
删除多个:docker rmi -f 镜像id 镜像id 镜像id
删除全部:docker rmi -f $(docker images -qa)
3.容器命令
1.新建+启动容器
//新建+启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号
--name="容器新名称" 为容器指定一个名称;
-d:后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-i:以交互模式运行容器,通常与-t同时使用;
-t:为容器重新分配一个伪输入终端,通常与-i同时使用
也即启动交互式容器(前台有伪终端,等待交互);
-P:随机端口映射,大写P
-p:指定端口映射,小写p
启动交互式容器(前台命令行)
使用镜像ubuntu:latest以交互模式启动一个容器,在容器内执行/bin/bash命令.
docker run -it ubuntu /bin/bash
参数说明:
-i:交互式操作.
-t:终端.
ubuntu:ubuntu 镜像.
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式Shell,因此用的是/bin/bash.
要退出终端,直接输入exit
2. 列出当前所有正在运行的容器
列出正在运行的容器
docker ps
列出当前所有正在运行的容器+历史上运行过的
docker ps -a
显示最近创建的容器
docker ps -l
显示最近n个创建的容器
docker ps -n
静默模式,只显示容器编号
docker ps -q
3.退出容器
run进去容器,exit退出,容器停止
exit
run进去容器,ctrl+p+q退出,容器不停止
ctrl+p+q
4.启动已停止运行的容器
docker start 容器id或者容器名称
5.重启容器
docker restart 容器id或容器名
6.停止容器
docker stop 容器id或容器名
7.强制停止容器
docker kill 容器id或容器名
8.删除已停止的容器
删除已停止的容器
docker rm 容器id
强制删除
docker rm -f 容器id
一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
9. 启动守护式容器(后台服务器)
redis为例
前台模式:
docker run -it 容器名或容器id
后台模式:
docker run -d 容器名或容器id
10.查看容器日志
docker logs 容器id
11.查看容器内运行的进程
docker top 容器id
12.查看容器内部细节
docker inspect 容器id
13.进入正在运行的容器并以命令行交互
重新进入
docker exec -it 容器id /bin/bash
重新进入
docker attach 容器id
14.从容器内拷贝文件到主机上
docker cp 容器id:容器内路劲 目的主机路径
例如:
docker cp 容器id:/usr/local/mycptest/container.txt(容器内路径) /tmp/c.text(主机路径)
15.导入和导出容器
export导出容器的内容流作为以个tar归档文件[对应import命令]
例如:docker export 容器id>文件名.tar
import从tar包中的内容创建一个新的文件系统在导入为镜像[对应export]
例如:cat 文件名.rar | docker import - 镜像用户/镜像名:镜像版本号
16.docker镜像commit操作案例
docker commit提交容器副本使之成为一个新的镜像
docker commit -m=提交的描述信息"" -a="作者" 容器id要创建的目标镜像名:[标签名]
案例演示:安装vim
1.更新包管理工具
apt-get update
2.安装vim
apt-get -y install vim
17.本地镜像发布阿里云流程
1.镜像的生成方法参考16,另一种方式为dockerfile
进入阿里云开发者平台 :
https://promotion.aliyun.com/ntms/act/kubernetes.html
创建仓库镜像
选择控制台,进入容器镜像服务
选择个人实例
命名空间
继续
仓库名称
继续
进入管理界面获得脚本
- 将镜像推送到阿里云
- 将镜像推送到阿里云registry
- 管理界面脚本
- 将镜像推送到阿里云registry
脚本实例
官网会生成,黏贴阿里云官网的
阿里云镜像下载至本地
docker pull registry.cn-hangzhou.aliyuncs.com/atguiguwh/myubuntu:1.1
18.本地镜像推送至私有仓库
1.下载docker registry
docker pull registry
2.运行私有库registry,相当于本地有个私有docker hub
docker run -d -p 5000:5000 -v /zzyyuse/myregistry/:/tmp/registry --privileged=true registry
默认情况,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便与宿主机联调
- 案例演示创建一个新镜像,ubuntu安装ifconfig命令
- 原始的Ubuntu镜像是不带着ifconfig命令的
- 从Hub上下载ubuntu镜像到本地并成功运行
- 外网连通的情况下,安装ifconfig命令并测试通过
docker 容器内执行命令
apt-get update
apt-get install net-tools
- 安装完成后,commit我们自己的新镜像
公式:
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
命令:在容器外执行,记得
docker commit -m="ifconfig cmd add" -a="zzyy" a69d7c825c4f zzyyubuntu:1.2
- 启动我们的新镜像并和原来的对比
- 官网是默认下载的Ubuntu没有ifconfig命令
- 我们自己commit构建的新镜像,新增加了ifconfig功能,可以成功使用。
curl验证私服库上有什么镜像
curl -XGET http://192.168.111.162:5000/v2/_catalog
可以看到,目前私服库没有任何镜像上传过。。。。。。
将新镜像myubuntu:1.3修改符合私服规范的tag
按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag
自己host主机IP地址,填写同学你们自己的,不要粘贴错误,O(∩_∩)O
使用命令 docker tag 将zzyyubuntu:1.2 这个镜像修改为192.168.111.162:5000/zzyyubuntu:1.2
docker tag zzyyubuntu:1.2 192.168.111.162:5000/zzyyubuntu:1.2
修改配置文件使之支持http
vim命令新增如下红色内容:vim /etc/docker/daemon.json
上述理由:docker默认不允许http方式推送镜像,通过配置选项来取消这个限制。====> 修改完后如果不生效,建议重启docker
push推送到私服库
docker push 192.168.111.162:5000/zzyyubuntu:1.2
curl验证私服库上有什么镜像
curl -XGET http://192.168.111.162:5000/v2/_catalog
pull到本地运行
docker pull 192.168.111.162:5000/zzyyubuntu:1.2
docker run -it 镜像ID /bin/bash
4.docker容器数据卷
1.容器卷记得加入
如果docker挂载主机目录访问出现cannot open directory .:Permission denied
解决办法:在挂载目录后多加一个--privileged=true参数即可
开启后容器内的root拥有真正的root权限
2.运行一个带有容器卷存储功能的容器实例
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录 镜像名
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:rw 镜像名
默认:rw可读可写
docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
ro:只读
2.卷的继承和共享
docker run -it --privileged=true --volumes-from 父类 --name=u2 容器名,容器id
5.docker常规安装简介
1.总体步骤
2.tomcat安装
docker run -d -p 8080:8080 --name mytom 镜像id或镜像名
//运行成功后无法通过端口访问,需要将webapps.dist用mv webapps.dist webapps
//免修改版
docker pull billygoo/tomcat8-jdk8
docker run -d -p 8080:8080 --name mytom 镜像名或镜像id
3.mysql安装
//简单版安装
docker pull mysql:5.7
//启动mysql实例
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d 镜像名或镜像id
//docker安装mysql可能会出现插入中文数据报错
因为docker上默认字符集编码隐患
//实战版安装
docker run
-d
-p 3306:3306 --privileged=true
-v /develop/mysql/log:/var/log/mysql
-v /develop/mysql/data:/var/lib/mysql
-v /develop/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=root
--name mysql 镜像id或镜像名:版本
解决中文乱码问题
//新建my.cnf文件
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
//重启mysql
docker restart 容器id或容器名
4.redis安装
docker pull redis:6.0.8
修改redis.conf文件
使用使用挂载安装redis
docker run
-p 6379:6379
--name myr3
--privileged=true
-v /develop/redis/redis.conf:/etc/redis/redis.conf
-v /develop/redis/data:/data
-d
redis:6.0.8
//这里是告诉服务端应该去读取容器内那个目录下得配置文件
redis-server /etc/redis/redis.conf
docker run -p 6379:6379 --name redis --privileged=true -v /develop/redis/conf/redis.conf:/etc/redis/redis.conf -v /develop/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
5.nginx安装
# 生成容器
docker run --name nginx -p 9001:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /develop/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /develop/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /develop/nginx/
docker run \
-p 9002:80 \
--name nginx \
-v /develop/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /develop/nginx/conf/conf.d:/etc/nginx/conf.d \
-v /develop/nginx/log:/var/log/nginx \
-v /develop/nginx/html:/usr/share/nginx/html \
-d 605c77e624dd
5.dockerfile
1.构建三步骤
- 编写dockerfile
- docker build命令构建镜像
- docker run依镜像运行容器实例
- docker build命令构建镜像
2.dockerfile内容基础知识
- 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
- 指令按照从上到下,顺序执行
- #表示注释
- 每条指令都会创建一个新的镜像层并对镜像进行提交
3.docker执行dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似docker commit的操作提交一个新的镜像层
- docker在基于刚提交的镜像运行一个新的容器
- 执行dockerfile中的下一条指令直到所有指令都执行完成
4.dockerfile常用保留字
- FROM
- 基础镜像,当前新镜像是基于那个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
- MAINTAINER
- 镜像维护者的姓名和邮箱地址
- RUN
- 容器构建时需要运行的命令
- 两种格式
- shell格式
- exec格式
- RUN是在docker build时运行
- EXPOSE
- 当前容器对外暴露出的端口
- WORKDIR
- 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
- USER
- 指定该镜像以什么样的用户去执行,如果都不指定,默认是root
- ENV
- 用来在构建镜像过程中设置环境变量
- ADD
- 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
- COPY
- 类似ADD,拷贝文件和目录到镜像中
- 将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
- COPY src dest
- COPY ["src","dest"]
- <src源路径>:源文件或源目录
- <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建
- VOLUME
- 容器数据卷,用于数据保存和持久化工作
- CMD
- 指定容器启动后的要干的事情
- 注意
- dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换
- 参考官网tomcat的dockerfile演示讲解
- 官网最后一行命令
- 我们演示自己的覆盖操作
- 它和前面RUN命令的区别
- CMD是在docker run时运行
- RUN是在docker build时运行
- ENTRYPOINT
- 也是用来指定一个容器启动时要运行的命令
- 类似于CMD指令,但是ENTRYPOINT不会被docker run后面的命令覆盖,而且这些命令行参数会被当做参数送给ENTRYPOINT指令指定的程序
- 命令格式和案例说明
- 优点
- 在执行docker run的时候可以指定ENTRYPOINT运行所需的参数
- 注意
- 如果dockerfile中如果存在多个ENTRYPOINT指令,仅最后一个生效
5.自定义mysentos7+jdk8镜像+vim+ifconfig
FROM centos
MAINTAINER zzyy<zzyybs@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
构建
docker build -t 新镜像名字:TAG .
注意,上面TAG后面有个空格,有个点
#自编dockerfile
FROM centos:7
MAINTAINER zp<zp@1630com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
#安装wget
RUN mkdir -p /usr/local/wget
ADD wget-1.14-18.el7_6.1.x86_64.rpm /usr/local/wget/
RUN rpm -ivh /usr/local/wget/wget-1.14-18.el7_6.1.x86_64.rpm
#安装yum,这里可以使用wget安装
RUN mkdir -p /usr/local/yum-install
RUN rpm -aq|grep yum|xargs rpm -e --nodeps
ADD yum-3.4.3-168.el7.centos.noarch.rpm /usr/local/yum-install/
ADD yum-metadata-parser-1.1.4-10.el7.x86_64.rpm /usr/local/yum-install/
ADD yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm /usr/local/yum-install/
ADD python-iniparse-0.4-9.el7.noarch.rpm /usr/local/yum-install/
RUN rpm -ivh --force --nodeps /usr/local/yum-install/yum-3.4.3-168.el7.centos.noarch.rpm
RUN rpm -ivh --force --nodeps /usr/local/yum-install/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
RUN rpm -ivh --force --nodeps /usr/local/yum-install/yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch.rpm
RUN rpm -ivh --force --nodeps /usr/local/yum-install/python-iniparse-0.4-9.el7.noarch.rpm
#安装vim编辑器
RUN rpm --rebuilddb && yum install -y vim
#安装ifconfig命令查看网络IP 如果有多条run yum install 需要在每条前加rpm --rebuilddb &&
RUN rpm --rebuilddb && yum install net-tools.x86_64 -y
#安装java8及lib库
RUN rpm --rebuilddb && yum install -y glibc.i686
RUN mkdir -p /usr/local/java
#ADD是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一文职
ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
#自编dockerfile
FROM ubuntu
MAINTAINER zp<zp@1630com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV DEBIAN_FRONTEND=noninteractive
#安装yum
RUN apt update
RUN apt-get install -y vim-gtk
RUN apt install -y build-essential
RUN apt install -y net-tools
#安装jdk8
RUN mkdir -p /usr/local/java
ADD jdk-8u202-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_202
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 99
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
6.dockerfile部署SpringBoot项目
# 基础镜像使用java
FROM java:8
# 作者
MAINTAINER ZP<441764254@QQ.COM>
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
#将jar包添加到容器中并更名为app
ADD demo-0.0.1-SNAPSHOT.jar app.jar
#运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]
# 暴露8089端口作为微服务
EXPOSE 8089