• docker命令介绍,镜像制作,容器启动,进入容器操作等


    1:在linux安装docker环境一键安装命令:

    curl -sSL https://get.daocloud.io/docker | sh
    
    • 1

    2:查看 Docker 是否安装成功:

    docker version
    
    • 1

    运行第一个hello-world镜像程序

    sudo docker run hello-world
    
    • 1

    3:启动docker

    service docker start
    
    • 1

    3-1:重启:

    service docker restart  
    
    • 1

    3-2:关闭docker服务:

    service docker stop
    
    • 1

    3-3:查看docker是否启动:

    systemctl status docker 
    
    • 1

    4.安装tomcat镜像

    #搜索tomcat镜像

    docker search tomcat 
    
    • 1

    #安装tomcat镜像

    docker pull tomcat 
    
    • 1

    #查看已安装的tomcat镜像

    docker images 
    
    • 1

    5.通过下载tomcat镜像启动一个tomcat容器(启动一个容器通过一个镜像,不同的镜像启动不同的容器)

    -d表示后台运行,-p端口映射,前面的8088是外围访问端口(也就是本机ip对外开放的端口),后面8080是docker容器内部的端口
    tomcat:last last是指定的tomcat的标签,相同的镜像可以指定不同的标签以做区分。

    docker run -d -p 8080:8080 tomcat:latest
    
    • 1

    6.查看运行的docker容器

    docker ps
    
    • 1

    #进入docker里面的tomcat容器,需要容器ID,所以上面要查看正在运行的容器tomcat

    -i:以交互模式运行容器

    -t:为容器重新分配一个伪输入终端

    docker exec -it 9fccf0236619 /bin/bash
    
    • 1

    #查看tomcat镜像内部文件,并进入webapps文件夹
    #Linux命令
    cd /回到根目录,
    cd ~进入用户主目录;
    cd -返回进入此目录之前所在的目录;
    cd …返回上级目录;
    cd …/…返回上两级目录;

    ls
    cd webapps

    退出容器:

    exit
    
    • 1

    启动容器:

    docker start containerID
    
    • 1

    停止容器:

    docker stop containerID
    
    • 1

    7.验证tomcat容器

    通过在浏览器中访问tomcat来查看启动的tomcat镜像是否可以正常运行,访问方式同一般机器下部署tomcat,即:http://ip:8080,根据自己ip地址情况。如我的测试地址是:http://192.168.93.128:8080

    8.将war包放入到docker下的tomcat中

    将war包通过Ftp放入linux系统中的usr目录下,并将war包拷贝到docker中,containerID 是你所启动tomcat镜像的容器ID或者容器名称也可以,用docker ps命令查看。 这是将test.war放到tomcat的webapps下

    docker cp /usr/test.war containerID:/usr/local/tomcat/webapps/
    
    • 1

    9.由于war包在tomcat下是自动解压的,所以我们稍等项目完全成功启动,我们就可以直接访问项目了。

    本地打开浏览器直接访问,不成功就等项目成功启动后,或者多试几次就ok。

    10.使用linux目录长期与docker容器目录挂载

    #(什么是宿主机:自己当前的服务器centOS7称之为宿主机,宿主机上的docker可看作一个容器,也就是docker所在的服务器称为宿主机)
     为挂载目录之前做准备:

    在usr/local/目录下创建一个dev目录,dev目录用来专门存放开发包什么的,dev目录下再创建一个docker-tomcat目录,行了,就用docker-tomcat进行映射到docker中的tomcat容器里的webapps目录,创建目录如下图:

    11.下面是我使用docker部署Java项目的一些经验总结:

    一、首先将自己完成的项目打包,我这里是打jar包,然后编辑Dockerfile文件。

    11-1.第一个Dockerfile文件

    在 Dockerfile 中,COPY 和 ADD 命令用于将文件和目录复制到 Docker 镜像中,但它们之间有一些区别

    • COPY 命令用于简单的文件复制操作,不执行任何额外功能
    • ADD 命令除了具有 COPY 命令的所有功能外,还可以复制远程 URL 文件并自动解压缩

    一般来说,如果仅需要简单的文件复制操作,推荐使用 COPY 命令。而对于需要支持自动解压缩或复制远程文件的情况,可以考虑使用 ADD 命令

    #Java镜像
    FROM java:8
    #指定目录
    VOLUME /tmp
    #复制指定的 myproject-web.jar 到容器中的 app.jar,myproject-web.jar是我的项目jar包
    ADD myproject-web.jar app.jar
    #暴露端口 80 -- 容器内部端口
    #EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应该就会开启这个端口的服务。
    #在Dockerfile中写入这样的声明有两个好处:
    #1:是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
    #2:在运行是使随机端口映射时,也就是docker run -P时,会自动随机映射EXPOSE端口
    EXPOSE 80
    #镜像build的时候执行的命令
    RUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \
        && echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \
        && apk update upgrade \
        && apk add --no-cache curl bash \
        && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && echo "Asia/Shanghai" > /etc/timezone 
    #入口,jar文件的启动命令,ENTRYPOINT容器启动后执行的命令
    ENTRYPOINT ["java","-jar","/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    11-2.第二个Dockerfile文件

    #基础镜像java
    From openjdk:8-alpine
    #指定容器内工作路径(此目录会在容器的根目录创建,存放的镜像前的文件,类似jar包)
    WORKDIR icdist
    #就是你上传的jar包的名称 添加到 镜像中
    ADD myproject-web.jar dist/app.jar
    #EXPOSE指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应该就会开启这个端口的服务。
    #在Dockerfile中写入这样的声明有两个好处:
    #1:是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;
    #2:在运行是使随机端口映射时,也就是docker run -P时,会自动随机映射EXPOSE端口
    #暴露的端口必须和容器内应用的端口一致
    EXPOSE 8080
    #镜像build的时候执行的命令
    RUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \
        && echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \
        && apk update upgrade \
        && apk add --no-cache curl bash \
        && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && echo "Asia/Shanghai" > /etc/timezone 
    #入口,jar文件的启动命令,ENTRYPOINT容器启动后执行的命令
    ENTRYPOINT ["java","-jar","dist/app.jar"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    11-3.第三个Dockerfile文件

    FROM anapsix/alpine-java:8_server-jre_unlimited
    
    #对时作用
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    #目录是终端默认在此目录下
    WORKDIR /test
    
    #暴露的端口必须和容器内应用的端口一致
    EXPOSE 8088
    #如果是到文件夹后面必须加上“/”,不然会找不到文件
    COPY ./target/poi.jar /app/
    
    #poi.jar包就会在根目录/app/poi.jar下
    CMD java -jar /app/poi.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    11-4.第四个Dockerfile文件

    FROM anapsix/alpine-java:8_server-jre_unlimited
    
    #对时作用
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    #目录是终端默认在此目录下
    WORKDIR /test
    
    #暴露的端口必须和容器内应用的端口一致
    EXPOSE 8088
    #如果是到文件夹后面必须加上“/”,不然会找不到文件,./代表当前目录即是/test目录
    COPY ./target/poi.jar ./app/
    
    #poi.jar包就会在根目录/test/app/poi.jar下
    CMD java -jar ./app/poi.jar
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    拓展:
    Dockerfile文件编写规则:
    1、指令大小写不敏感,为了区分习惯上用大写
    2、Dockerfile 非注释行第一行必须是 FROM
    3、文件名必须是 Dockerfile
    4、Dockerfile 指定一个专门的目录为工作空间
    5、所有引入映射的文件必须在这个工作空间目录下
    6、Dockerfile 工作空间目录下支持隐藏文件(.dockeringore)
    7、(.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录
    8、每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条。

    将编辑好的Dockerfile文件和打包好的myproject-web.jar文件放在同一个文件夹,最好新建一个目录放里面。

    12:将jar包文件和编写的Dockerfile文件放在linux的一个指定文件下

    在该目录下使用docker build制作镜像 命令为:

    docker build -t myproject-web:V1.0 . 
    
    • 1

    docker build基本使用说明:
    格式:

    docker build -t ImageName:TagName dir
    
    • 1

    选项说明
    -t 给镜像加一个Tag
    ImageName 给镜像起的名称
    TagName 给镜像的Tag名

    Dir Dockerfile所在目录(一般都是 “.” , 注意这个“.” 就是表示当前目录下 )

    使用例子:

    docker build -t myproject-web:V1.0 .
    
    • 1

    解释:
    myproject-web 是镜像名
    vV1.0是 tag 标签
    . 表示当前目录,即Dockerfile所在目录

    可以使用docker images查看镜像
    现在我们使用docker images查看刚构建的镜像:
    命令:

    docker images | grep myproject-web
    
    • 1

    三、使用docker run命令来启动我们容器
    操作命令:

    docker run -d --name myproject-web-V1.0 -p 80:8089 myproject-web
    
    • 1

    这个命令是指启动myproject-web项目,-d是后台运行,将宿主机的80端口映射到容器的8089端口(这个端口是我启动项目的端口,也就是项目中的配置文件里面的端口8089),
    myproject-web-V1.0是启动项目容器的别名,容器的别名要指定,不然每次启动都会随机生成一个别名,也不清楚是否启动了此容器,造成容器重复启动,myproject-web是我们上面构建的镜像名称。

    最后可以使用docker ps 和 docker ps -a查看我们启动的容器
    docker ps命令用来展示所有运行中的容器,
    如果镜像启动失败了,使用 docker ps 查看不到,可以使用docker ps -a该命令,查看所有镜像
    docker ps -a 命令是用来展示所有所有的容器,包括未运行的容器

    ##解压文件命令

    tar -xzf redis.tar.gz
    
    • 1

    ##保存nginx镜像

    docker save nginx|gzip > nginx-latest.tar.gz
    
    • 1

    加载镜像:

    docker load -i nginx-latest.tar.gz
    
    • 1

    镜像下载地址

    https://hub.docker.com/

    删除指定容器

    docker rm -f <containerid>
    
    • 1

    删除未启动成功的容器

    docker rm $(docker ps -a|grep Created|awk '{print $1}')
    
    • 1

    或者

    docker rm $(docker ps -qf status=created)
    
    • 1

    删除退出状态的容器

    docker rm $(docker ps -a|grep Exited|awk '{print $1}')
    或者
    docker rm $(docker ps -qf status=exited)
    
    • 1
    • 2
    • 3

    删除所有未运行的容器

    docker rm $(docker ps -a -q) #正在运行的删除不了,所有未运行的都被删除了
    或者
    docker container prune #Docker 1.13版本以后,可以使用 docker containers prune 命令,删除孤立的容器

    start 启动所有容器

    docker start $(docker ps -a -q)
    
    • 1

    stop停止所有容器

    docker stop $(docker ps -a -q)
    
    • 1

    remove删除所有容器

    docker rm $(docker ps -a -q) 
    
    • 1

    1 首先使用docker ps -a 查看本机上的所有容器

    docker ps -a
    
    • 1

    在 Docker 中,docker import 和 docker export 命令用于导出和导入容器快照(不包括镜像的历史记录和元数据),而不是直接导出和导入镜像

    通过容器导出导出镜像(导出和导入容器快照(不包括镜像的历史记录和元数据))

    #使用docker export命令根据容器id将镜像导成一个文件
    #此类导出就类似一个linux文件

    docker export 容器id > image.tar
    
    • 1

    上面命令执行之后,我们便可以通过ls命令在当前目录下发现image.tar

    使用docker import命令将这个镜像导进来

    cat <输入文件名.tar> | docker import - <新镜像名称>

    cat my-container-iage.tar | docker import - imageName
    
    • 1

    通过docker images 命令查看镜像是否导入

    注意虽然这种方式导入镜像成功,但是启动不了容器

    通过镜像导出导出镜像(这种方式可以保留完整的镜像历史记录和元数据,以便在不同的 Linux 环境中共享和迁移镜像)

    1 通过docker image查看本机上的所有镜像

    docker images
    
    • 1

    2 找到要上传的镜像的id,使用docker save命令将镜像保存为一个文件

    #在那个文件打开,就导出镜像到那个文件

    docker save 镜像id > image.tar
    
    • 1

    docker save 可以将多个image打包成一个文件

    注意:通过镜像id导出新镜像的Tag和Respository可能为none

    docker save -o image.tar 镜像名字:Tag
    
    • 1

    在这里插入图片描述

    通过镜像名和TAG导出如下

    docker save -o image.tar poi:1.0
    
    • 1
    docker save -o image.tar 镜像1 镜像2
    
    • 1

    3 通过docker load载入镜像

    docker load -i <输入文件名.tar>
    
    • 1

    例如,要导入 my-image.tar 文件,可以运行以下命令:

    docker load -i my-image.tar
    
    • 1

    这两种方案的差别

    1,文件大小不同
    export 导出的镜像文件体积小于 save 保存的镜像

    2,是否可以对镜像重命名
    docker import 可以为镜像指定新名称
    docker load 不能对载入的镜像重命名
    3,是否可以同时将多个镜像打包到一个文件中
    docker export 不支持
    docker save 支持
    4,是否包含镜像历史
    export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅保存容器当时的快照状态),所以无法进行回滚操作。
    而 save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。
    5,应用场景不同
    docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。
    docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

    拉取mysql镜像

    docker pull mysql:5.7
    
    docker run --name=mysql-test -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root123456 -d mysql
    参数说明:
    --name:指定了容器的名称,方便之后进入容器的命令行。
    -itd:其中,i是交互式操作,t是一个终端,d指的是在后台运行。
    -p:指在本地生成一个随机端口,用来映射mysql的3306端口。
    -e:设置环境变量。
    MYSQL_ROOT_PASSWORD=root123456:指定了MySQL的root密码
    -d mysql:指运行mysql镜像,设置容器在在后台一直运行
    
    
    
    docker run -itd -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  --name mysql01 mysql:5.7
    -d 后台运行
    -p 端口映射
    -v 卷挂载(容器外映射到容器内部)
    -e 环境配置
    –name 容器名
    
    docker run -d --name myMysql -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql
    -d 表示在后台运行容器
    –name 表示为后台运行的容器取别名,便于后续的操作
    -v 用来指定数据卷,将正在运行mysql的容器上的/var/lib/mysql目录映射到宿主机上的/data/mysql目录
    如果数据卷映射失败,是因为无权限访问,设置权限chcon -Rt svirt_sandbox_file_t /data/mysql
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    进入MySQL容器:

    docker exec -it mysql-test /bin/bash
    
    • 1

    #进入MySQL:
    mysql -uroot -p
    Enter password:root123456

    进入容器的方法,精简版安装环境所以用/bin/bash是进不去容器的,需要使用/bin/sh才能进去

    docker exec -it hdx-monitor  /bin/bash
    docker exec -it hdx-monitor  /bin/sh
    
    • 1
    • 2

    退出teiminal ctrl+q/ctrl+p
    退出容器命令 exit

    查看全部容器网络

    docker network ls

    查看容器详细信息

    docker inspect 容器ID

    docker容器操作寄主机docker

    docker inspect 容器名/容器ID

    docker run  -p 8180:8180 --name name  -v /var/run/docker.sock:/var/run/docker.sock  -v $(which docker):/usr/bin/docker name 
    
    • 1

    Dockerfile基本命令

    FROM			指定基础镜像
    MAINTAINER		指定作者
    RUN			执行参数中定义的命令,构建镜像时需要的命令
    EXPOSE			向容器外部公开的端口号
    WORKDIR			设置容器内默认工作目录
    USER			指定用户
    ENTROYPOINT		指定一个容器启动时运行的命令
    ENV			设置环境变量
    ADD|COPY		复制文件到镜像中
    VOLUME			容器数据卷,向镜像创建的容器添加卷
    CMD			容器启动时要运行的命令,可以有多个,但只有最后一个生效
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过dockers拷贝文件到指定容器的位置,containerID为容器id或者容器名都可以

    docker cp /usr/test.war containerID:/usr/local/tomcat/webapps/
    
    • 1

    Dockerfile文件配置详情介绍

    FROM anapsix/alpine-java:8_server-jre_unlimited
    
    MAINTAINER xu
    
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    
    RUN mkdir -p /opt/projects/weims
    
    WORKDIR /opt/projects/weims
    
    COPY ./admin.jar /opt/projects/admin
    
    #暴露的端口必须和容器内应用的端口一致
    EXPOSE 7700
    
    CMD java -jar -Xms512m -Xmx512m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC /opt/projects/admin/admin.jar
    
     #MAINTAINER xu
    ​ 这行对docker镜像编译无实际影响,只是记录该镜像制作人和联系方式
    
    #WORKDIR /usr/local/tomcat/webapps/
    ​ workdir代表容器当前进入到此目录下 即相当于容器执行了 cd /usr/local/tomcat/webapps/命令
    
    #RUN rm -rf /usr/local/tomcat/webapps/*
    ​ run 命令 即相当于在容器执行shell命令 run 后面的即是shell命令
    
    #ADD springboot.war /usr/local/tomcat/webapps/ROOT.war
    ​ ADD 和COPY命令都是将本地的文件拷贝到容器内 ADD 宿主机文件或文件夹 容器内文件或文件夹
    ​ 该命令也可以用 ADD ./ /usr/local/tomcat/webapps/ 这条命令代表将当前目录下的所有文件拷贝到容器webapps/下,文件名称不会改变
    
     RUN echo "Asia/Shanghai" > /etc/timezone
     让容器内的时间和宿主机时间一致
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    mysql数据库Dockerfile

    FROM mysql:5.7
    MAINTAINER hejing@szlabsun.com
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    COPY ./weims_sd.sql /docker-entrypoint-initdb.d
    
    • 1
    • 2
    • 3
    • 4

    #COPY ./weims_sd.sql /docker-entrypoint-initdb.d
    该命令是将 ./下的sql文件放到docker容器数据库启动的初始脚本文件夹中,这样mysql在启动时会执行该脚本,建库建表

  • 相关阅读:
    DGIOT基于低代码amis配置联动短信告警
    快速创建微信小程序,注册即认证,无需300元认证费
    教程 | 使用 Apache SeaTunnel 同步本地文件到阿里云 OSS
    (九)React Ant Design Pro + .Net5 WebApi:后端环境搭建-IdentityServer4(一)简单配置
    从需求角度介绍PasteSpider(K8S平替部署工具适合于任何开发语言)
    【编译原理+句柄+入栈顺序从右至左+系统调用+win api+程序安排+acm ieee usenix信息】答疑
    【自用】深度学习工作站安装ubuntu 18.04 LTS系统
    边坡监测系统:全天监测、智能预警
    uni-app 获取视频第一帧转换为图片 并展示
    蓝桥杯练习01卡片化标签
  • 原文地址:https://blog.csdn.net/qq_19891197/article/details/128014020