启动docker
关闭docker
(资料图片仅供参考)
重启docker
docker设置随服务启动而自启动
查看docker运行状态
查看docker 版本信息
docker帮助命令
查看自己服务器中docker镜像列表
搜索镜像
搜索STARS>9000的mysql 镜像
拉取镜像,拉取latest版本
拉取指定版本
运行镜像
运行指定版本
删除一个镜像
删除多个镜像
删除全部镜像 -a意思为显示全部,-q意思为只展示ID
强制删除镜像
保存镜像
加载镜像
镜像标签
有的时候呢,我们需要对一个镜像进行分类或者版本迭代操作,比如我们一个微服务已经打为docker镜像,但是想根据环境进行区分为develop环境与alpha环境,这个时候呢,我们就可以使用Tag,来进对镜像做一个标签添加,从而行进区分;版本迭代逻辑也是一样,根据不同的tag进行区分
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
查看正在运行的容器列表
查看所有容器,包含正在运行的,停止的
运行容器
docker run -it -d --name 要取得别名 镜像名:TAG /bin/bash
实战:启动一个redis 把它的别名取为redis001 并交互式运行 需要的命令 —我这里指定版本号为5.0.5
docker pull redis:5.0.5
docker run -it -d --name redis001 redis:5.0.5 /bin/bash
docker ps
查看运行的容器
发现看到了 redis 使用了6379 端口 那么我们在关闭防火墙或开启了安全组的情况下 是否可以进行访问呢?
为了 区分 咱们使用linux 命令 查看一下
netstat -untlp
惊讶的发现,我们redis容器启动占用的 6379端口netstat 没有显示出来?什么情况?赶紧使用 redis desktop manger 连接测试一下
补充
每一个 Docker容器都是独立和安全的应用平台(我们可以理解为,每一个docker容器都相当于在我们的服务器上占用资源然后开辟了属于自己的一个空间(也可以理解为服务器))
默认情况下,我们是无法通过宿主机(安装docker的服务器)端口来直接访问容器的 ,因为docker容器自己开辟空间的端口与宿主机端口没有联系…
如果外部想要访问容器,那必须得让容器中的端口与宿主机的端口建立联系绑定起来,这个正式的概念叫做 容器端口映射
具体步骤
docker stop 容器名/容器ID
docker rm -f 容器名/容器ID
-p 宿主机端口:容器端口
建立容器端口与服务器端口映射
docker run -it -d --name redis001 -p 8888:6379 redis:5.0.5 /bin/bash
那么容器端口映射有没有什么限制呢?
进入容器
docker exec -it 容器名/容器ID /bin/bash
docker attach 容器名/容器ID
退出容器
exit
ctrl + p + q
停止容器
重启容器
启动容器
kill容器
容器文件拷贝 —无论容器是否开启 都可以进行拷贝
查看容器日志
设置容器开机自启动
添加参数--restart=always 便表示,该容器随docker服务启动而自动启动
docker run -itd --name redis002 -p 8888:6379 --restart=always redis:5.0.5 /bin/bash
方法一、担心数据丢了,这说明你在跑容器的时候没有进行数据挂载吧???
数据挂载?
就是将容器内的数据与外部宿主机文件绑定起来,类似一个双持久化,当容器删除时,宿主机文件数据目录仍在,下次启动容器只要将数据目录指向宿主机数据所在位置即可恢复!
命令:-v 宿主机文件存储位置:容器内文件位置
docker run -it -d -p 6379:6379 --name redis505 --restart=always -v /var/lib/redis/data:/data -v /var/lib/redis/conf/:/usr/local/etc/redis/redis.conf redis:5.0.5 --requirepass "password"
方法二:不想删容器,又想让这个容器设置开机自启动,那么我们修改其启动配置即可!
更换容器名
构建一个新的镜像
我们拉取一个tomcat镜像 并持久化运行 且设置与宿主机进行端口映射
docker pull tomcat
docker run -itd -p 8080:8080 --name /bin/bash
访问 咱的端口 发现访问404 这是因为咱配置了阿里云镜像后 所拉取得镜像都是最基础班的 仅仅包含其容器必要数据 例如 容器中 vim vi ll 命令都没有
咱们的webapps 下一个文件都没有 ,访问肯定404罗
不断查看 发现咱 webapps.dist 下是有文件的 我们把它拷贝的webapps 下 然后打包成一个新的镜像 后 访问查看是否进入到首页 不进入404页面
为了区分 咱停止并删除之前tomcat 的容器
运行自己打包的容器
docker 运维命令
可能有时候发布会遇到如下错误:
docker: write /var/lib/docker/tmp/GetImageBlob325372670: no space left on device
这个错误是docker在写入的时候报错无机器无空间
查看docker工作目录
查看docker磁盘占用总体情况
查看docker的磁盘使用具体情况
删除无用的容器和镜像
删除异常停止的容器
docker ps -a |grep Exited | awk "{print $1}"
删除名称或标签为none的镜像
docker images |grep "" | awk "{print $3}"
清除所有无容器使用的镜像
查找大文件
查找指定docker使用目录下大于指定大小文件
1.1 什么是Dockerfile
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
dockerfile 用于指示 docker image build 命令自动构建Image的源代码
是纯文本文件
示例
1.2 为什么要使用Dockerfile
问题:在dockerhub中官方提供很多镜像已经能满足我们的所有服务了,为什么还需要自定义镜像
完整镜像结构图
Dockerfile的格式
两种类型的行
由Image Builder顺序执行各指令,从而完成Image构建
语法
上下文
Docker 在运行时分为 Docker 引擎(也就是服务端守护进程)和客户端工具
docker build 命令构建镜像,其实并非在本地构建,而是在服务端,也就是 Docker 引擎中构建的
那么在这种客户端/服务端的架构中,如何才能让服务端获得本地文件呢?
为什么会有人误以为.·是指定 Dockerfile 所在目录呢?
官网地址
FROM
指定构建新image是使用的基础image,通常必须是dockerfile的第一个有效指令,但其前面也可以出现ARG指令
指定基础镜像,必须为第一个命令
格式
示例
注:
MAINTAINER(新版即将废弃)
维护者信息
格式:
MAINTAINER
示例:
MAINTAINER bertwu
MAINTAINER xxx@163.com
MAINTAINER bertwu
LABEL
附加到image之上的元数据,键值格式
用于为镜像添加元数据
格式:
LABEL = = = ...
示例:
注:
ENV
以键值格式设定环境变量,可悲气候的指令所调用,且基于新生成的image运行的image运行的container中也会存在这些变量
设置环境变量
格式:
ENV #之后的所有内容均会被视为其的组成部分,因此,一次只能设置一个变量
ENV = ... #可以设置多个变量,每个变量为一个"="的键值对,如果中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
RUN
以FROM中定义的image为基础环境有运行指定命令,生成结果将作为新image的一个镜像层,并可由后续指令所使用
构建镜像时执行的命令
RUN用于在构建镜像时执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
注:
CMD
基于改dockerfile生成的image运行container时,CMD能够指定容器中默认运行的程序,因而其可应该定义一次
构建镜像后调用,也就是在容器启动时才进行调用。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
示例:
CMD ["/usr/bin/wc","--help"]
注:
ENTRYPOINT
类似于CMD指令的功能,但不能被命令行指定要运行的应用程序覆盖,且与CMD共存时,CMD的内容将作为该指令中定义的成都的参数
配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
格式:
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
注:
WORKDIR
为RUN、CMD、ENTRYPOINT、COPY和ADD等指令指定工作目录
工作目录,类似于cd命令
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
ADD
与COPY指令的功能相似,但ADD额外也支持使用URL指定的资源作为源文件
将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
ADD ...
ADD ["",... ""] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
COPY
VOLUME
指定基于新生成的image运行container时期望作为volume使用的目录
用于指定持久化目录(指定此目录可以被挂载出去)
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
EXPOSE
指定基于新生成的image运行container时期望暴露的端口,但实际暴露与否取决于docker run命令的选项,支持tcp和udp协议
指定于外界交互的端口
格式:
EXPOSE [...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
USER
为dockerfile中该指令后面的RUN、CMD和ENTRYPOINT指令中要运行的应用程序指定运行者身份UID,以及一个可选的GID
指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
示例:
USER www
注:
ARG
定义专门用于build过程中的变量,但仅对该指定之后的调用生效,其值可由命令行选项“--build-arg”进行传递
用于指定传递给构建运行时的变量(给dockerfile传参),相当于构建镜像时可以在外部为里面传参
格式:
ARG [=]
示例:
ARG siteARG build_user=wwwFrom centos:7ARG parameterVOLUME /usr/share/nginxRUN yum -y install $parameterEXPOSE 80 443CMD nginx -g "daemon off;"
ONBUILD
触发器,生效于由该dockerfile构建出新的image被用于另一个dockerfile中的FROM指令作为基础镜像时
用于设置镜像触发器
格式:
示例:
注:
STOPSIGNAL
HEALTHCHECK
SHELL
如果有多个RUN,自上而下依次运行,每次运行都会形成新的层,建议&& 放入一行运行
如果有多个CMD,只有最后一个运行
如果有多个Entrypoint,只有最后一个运行
如果CMD和entrypoint共存,只有entrypoint运行,且最后的CMD会当做entrypoint的参数
镜像制作分为两个阶段
4.1 源码编译制作nginx镜像
FROM centos
MAINTAINER bertwu
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx-1.8.0.tar.gz /usr/local/ADD epel-release-latest-7.noarch.rpm /usr/local/
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpmRUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean allRUN useradd -s /sbin/nologin -M www
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
EXPOSE 80
CMD ["nginx"]
- 编译镜像- docker build -f 脚本文件名(默认dockerfile可以省略) -t 镜像名字 .(表示当前路径)- 示例- docker build -f dockerFile -t mynginx:0.1.0 .
4.2 制作简单镜像
root@ubuntu:~/myapp# vim hosts # 编写文件root@ubuntu:~/myapp# cat hosts127.0.0.1 localhost127.0.0.1 localhost.localdomain172.100.100.100 xxx.com
root@ubuntu:~/myapp# docker image build . # 构建镜像Sending build context to Docker daemon 3.072kBStep 1/3 : FROM alpine:3.15---> c059bfaa849cStep 2/3 : LABEL Maintainer="bertwu bertwu6688@edu.com"---> Running in 63324216f4ecRemoving intermediate container 63324216f4ec---> bb69e6b659a2Step 3/3 : ADD hosts /etc/hosts---> 0d6e00e31ce6Successfully built 0d6e00e31ce6root@ubuntu:~/myapp# docker image tag 0d6e00e31ce6 myapp:1.0 # 添加标签root@ubuntu:~/myapp# docker image ls # 查看镜像REPOSITORY TAG IMAGE ID CREATED SIZEmyapp 1.0 0d6e00e31ce6 About a minute ago 5.59MB
root@ubuntu:~/myapp# docker image inspect myapp:1.0 | grep -i maint"Maintainer": "bertwu bertwu6688@edu.com""Maintainer": "bertwu bertwu6688@edu.com"
4.3 自作1.1版本
root@ubuntu:~/myapp# cat DockerfileFROM alpine:3.15LABEL Maintainer="bertwu bertwu6688@edu.com"ADD repositories /etc/apk/repositories # 添加自己指定的repositoriesRUN apk update && apk add nginx bash # 安装nginx与bash
root@ubuntu:~/myapp# docker run --name myapp -it --rm myapp:1.1 /bin/bash # 制作镜像bash-5.1# which nginx/usr/sbin/nginxbash-5.1#bash-5.1# nginx -vnginx version: nginx/1.20.2bash-5.1#bash-5.1# cat /etc/apk/repositorieshttps://mirrors.aliyun.com/alpine/v3.15/mainhttps://mirrors.aliyun.com/alpine/v3.15/community
4.4 构建centos镜像
下面通过编写Dockerfile文件来制作Centos镜像,并在官方镜像的基础上添加vim和net-tools工具。首先在/home/dockfile 目录下新建文件Dockerfile。然后使用上述指令编写该文件。
Dockerfile[root@localhost dockerfile]# cat DockerfileFROM centos:7MAINTAINER bertwu 1258398543@qq.comENV MYPATH /usr/localWORKDIR $MYPATHRUN yum -y install vim net-toolsEXPOSE 80CMD /bin/bash
逐行解释该Dockerfile文件的指令:
下面执行build命令生成image文件,如果执行成功,可以通过docker images来查看新生成的镜像文件。
可以使用 docker history 镜像id 查看镜像构建过程
进入容器,看看是否能够执行ifconfig 及vim命令
4.5 构建springboot应用
FROM openjdk:8-jre # jar包基于jdk ,war包基于tomcatWORKDIR /appADD demo-0.0.1-SNAPSHOT.jar app.jar # 将上下文中 jar包复制到 /app目录下,并且重命名为app.jarEXPOSE 8081 # 暴露端口ENTRYPOINT[ "java" , "-jar" ] # 启动应用固定命令CMD["app.jar"] # 动态传递jar包名details/121846718
关键词:
Copyright 2015-2022 北冰洋城建网 版权所有 备案号:沪ICP备2020036824号-3 联系邮箱:562 66 29@qq.com