【Docker】学习笔记

参考

B站视频: 【狂神说Java】Docker最新超详细版教程通俗易懂

Docker概述

参考

原文:http://www.dockerinfo.net/document

概述

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。

Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

Docker安装

基本组成

  • 镜像(image)
  • 容器(container)
  • 仓库(repository)

在centOS上安装

环境

  • centOS 7
  • xshell

查看环境

  • 系统内核 3.10 以上,命令:
    uname -r
  • 系统版本7以上
    cat /etc/os-release

安装

参考官网:https://docs.docker.com/engine/install/centos/

  1. 卸载旧版本
sudo yum remove docker \
                docker-client \
                docker-client-latest \
                docker-common \
                docker-latest \
                docker-latest-logrotate \
                docker-logrotate \
                docker-engine
  1. 需要的安装包
sudo yum install -y yum-utils
  1. 设置镜像仓库(国内国外任选其一,更新索引为可选项)
  • 国外:(不推荐)
sudo yum-config-manager \
  --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo
  • 国内:
sudo yum-config-manager \
  --add-repo \
  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • (可选)更新yum软件包索引:yum makecache fast
  • 出现报错:(报错末尾内容)
    failure: repodata/repomd.xml from docker-ce-stable: [Errno 256] No more mirrors to try.
    https://mirrors.aliyun.com/docker-ce/linux/centos/$releasever/x86_64/stable/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found
  • 解决
  1. 进入如下目录,并修改内容:
    sudo vi /etc/yum.repos.d/docker-ce.repo
  2. 将其中的 $releasever 全部替换为 7
    注:我的当前系统的发行版本是7,可以通过cat /etc/redhat-release命令查看:
    CentOS Linux release 7.9.2009 (Core)
  3. 将其中的 $basearch 全部替换为 x86_64
    注:我的系统硬件架构是x86_64,可以通过arch命令查看
  • 我修改后的文件如下
[docker-ce-stable]
name=Docker CE Stable - x86_64
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-debuginfo]
name=Docker CE Stable - Debuginfo x86_64
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-x86_64/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-stable-source]
name=Docker CE Stable - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/stable
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test]
name=Docker CE Test - x86_64
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-debuginfo]
name=Docker CE Test - Debuginfo x86_64
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-x86_64/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-test-source]
name=Docker CE Test - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/test
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly]
name=Docker CE Nightly - x86_64
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-debuginfo]
name=Docker CE Nightly - Debuginfo x86_64
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/debug-x86_64/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg

[docker-ce-nightly-source]
name=Docker CE Nightly - Sources
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/source/nightly
enabled=0
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg
  1. 安装
sudo yum install docker-ce docker-ce-cli containerd.io
  1. 启动
sudo systemctl start docker
  • (可选)测试:docker version
  1. 测试hello word
sudo docker run hello-world
  • 查看镜像
docker images

卸载docker

#卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#删除资源
rm -rf /var/lib/docker

阿里云镜像加速

  1. 阿里云首页
    https://cn.aliyun.com/

  2. 登录 -> 控制台 -> 点侧边栏三条横线

  3. 产品与服务 -> 容器镜像服务 -> 弹性计算 -> 容器镜像服务

  4. 镜像工具 -> 镜像加速器 -> 操作文档 -> centOS
    复制命令,运行

Docker命令

帮助命令

docker version

显示docker版本信息
docker info
显示docker版本信息,包括镜像和容器的数量

  • 注:末尾显示如下内容,可忽略
WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support

(参考于https://stackoverflow.com/questions/69968135/warning-no-blkio-throttle-read-bps-device-support-what-is-this-message)

docker 命令 --help

帮助文档

镜像命令

docker images

显示镜像
REPOSITORY:镜像仓库源,TAG:镜像标签,IMAGE ID:镜像id,CREATED:创建时间,SIZE:大小

  • -a,–all:列出所有镜像
  • -q,-quiet:只显示镜像id

docker search

搜索镜像

  • -f,–filter:docker search mysql -f=stars=10,搜索mysql、且stars大于等于10

docker pull[:tag]

下载镜像,不指定tag,默认最新

docker rmi -f 镜像id

删除镜像
docker rmi -f $(docker images -aq)可删除所有镜像

容器命令

  • 说明:有了镜像才可以使用容器
    docker run [参数] image

例如:docker run -it centos /bin/bash

  • –name-“Name”:容器名字,用于区分容器
  • -d:后台方式运行,:如果没有提供服务会自动停止
  • -it:使用交换方式运行
  • -p:指定容器端口,-p8080:8080,映射主机与容器
  • -p ip:主机端口:容器端口
  • -p 主机端口:容器端口(常用)
  • -p 容器端口
  • 容器端口
  • -P:随机指定端口

docker ps

列出正在运行的容器

  • -a:列出正在运行的容器+历史运行过的容器
  • -aq:上述所有容器,显示id

退出容器


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 run --restart=always 容器id 或 容器名称
  • 正在运行的容器设置自启动:
    docker update --restart=always 容器id 或 容器名称

restart多个参数值选择

  • no 不自动重启容器. (默认值)
  • on-failure 容器发生error而退出(容器退出状态不为0)重启容器,可以指定重启的最大次数,如:on-failure:10
  • unless-stopped 在容器已经stop掉或Docker stoped/restarted的时候才重启容器
  • always 在容器已经stop掉或Docker stoped/restarted的时候才重启容器,手动stop的不算

其他常用命令

docker logs

显示日志

docker top 容器id

查容器进程

docker inspect 容器id

产看镜像元数据

docker exec -it 容器id bashShell

进入正在运行的容器,开启一个新的终端;bashShell,例如:/bin/bash

docker attach 容器id bashShell

进入正在运行的容器,不会启动新的进程;bashShell,例如:/bin/bash

docker cp 容器id:文件路径 路径

从容器拷贝文件到主机

练习

部署nginx


  • [root@YY liangjiayy]# docker search nginx

查nginx,也可以去https://hub.docker.com/去搜索

NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
bitnami/nginx                                     Bitnami nginx Docker Image                      117                  [OK]
bitnami/wordpress-nginx                           Bitnami Docker Image for WordPress with NGINX   55                   [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   31                   
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   15                   [OK]
rancher/nginx-ingress-controller                                                                  9                    
ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4                    
bitnami/nginx-ldap-auth-daemon                                                                    3                    
rancher/nginx-ingress-controller-defaultbackend                                                   2                    
circleci/nginx                                    This image is for internal use                  2                    
bitnami/nginx-exporter                                                                            1                    
rancher/nginx                                                                                     1                    
nginx                                             Official build of Nginx.                        0         [OK]       
rancher/nginx-conf                                                                                0                    
wallarm/nginx-ingress-controller                  Kubernetes Ingress Controller with Wallarm e…   0                    
rancher/nginx-ssl                                                                                 0                    
ibmcom/nginx-ppc64le                              Docker image for nginx-ppc64le                  0                    
rancher/nginx-ingress-controller-amd64                                                            0                    
ibmcom/nginx-ingress-controller-ppc64le           Docker Image for IBM Cloud Private-CE (Commu…   0                    
rancher/nginx-proxy                                                                               0                    
bitnami/nginx-intel                                                                               0                    
wallarm/nginx-ingress-controller-amd64            Kubernetes Ingress Controller with Wallarm e…   0                    
ibmcom/nginx-ingress-controller-amd64                                                             0                    
ibmcom/nginx-ingress-controller-s390x                                                             0                    
kasmweb/nginx                                     An Nginx image based off nginx:alpine and in…   0                    
wallarm/nginx-amd64                                                                               0                    
  • [root@YY liangjiayy]# docker pull nginx

下载镜像

Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete 
a9edb18cadd1: Pull complete 
589b7251471a: Pull complete 
186b1aaa4aa6: Pull complete 
b4df32aa5a72: Pull complete 
a0bcbecc962e: Pull complete 
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
  • [root@YY liangjiayy]# docker run -d -p 3344:80 nginx

-d:后台启动,-p:宿主机端口3344与内部机端口80映射,还可以用-name指定容器名称

b13e80bc78fc791719ccf74eef6a5d2be0fad3c6447310f1a62444239920f785
  • [root@YY liangjiayy]# docker ps

查看正在运行的容器

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
b13e80bc78fc   nginx     "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:3344->80/tcp, :::3344->80/tcp   suspicious_bassi
  • [root@YY liangjiayy]# curl localhost:3344

本机测试,也可用浏览器访问 ip:3344 测试

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

tomcat


  • 参考官网https://hub.docker.com/_/tomcat:
    docker run -it --rm tomcat:9.0

    -it:交互方式运行,–rm:用完就删除容器,适用于测试(按 ctrl + c 可退出)

  • [root@YY liangjiayy]# docker run -it --rm tomcat:9.0

Unable to find image 'tomcat:9.0' locally
9.0: Pulling from library/tomcat
0e29546d541c: Pull complete 
9b829c73b52b: Pull complete 
cb5b7ae36172: Pull complete 
6494e4811622: Pull complete 
668f6fcc5fa5: Pull complete 
dc120c3e0290: Pull complete 
8f7c0eebb7b1: Pull complete 
77b694f83996: Pull complete 
7662046c36cb: Pull complete 
b93639122cb4: Pull complete 
Digest: sha256:cd96d4f7d3f5fc4d3bc1622ec678207087b8215d55021a607ecaefba80b403ea
Status: Downloaded newer image for tomcat:9.0
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
16-Feb-2022 03:55:01.007 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.56
16-Feb-2022 03:55:01.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Dec 2 2021 14:30:07 UTC
16-Feb-2022 03:55:01.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.56.0
16-Feb-2022 03:55:01.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
16-Feb-2022 03:55:01.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.10.16.3-microsoft-standard-WSL2
16-Feb-2022 03:55:01.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
16-Feb-2022 03:55:01.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11
16-Feb-2022 03:55:01.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.13+8
16-Feb-2022 03:55:01.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
16-Feb-2022 03:55:01.033 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
16-Feb-2022 03:55:01.033 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
16-Feb-2022 03:55:01.162 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
16-Feb-2022 03:55:01.166 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
16-Feb-2022 03:55:01.167 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
16-Feb-2022 03:55:01.176 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
16-Feb-2022 03:55:01.177 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
16-Feb-2022 03:55:01.178 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
16-Feb-2022 03:55:01.194 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
16-Feb-2022 03:55:01.194 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
16-Feb-2022 03:55:01.196 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
16-Feb-2022 03:55:01.197 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
16-Feb-2022 03:55:01.197 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
16-Feb-2022 03:55:01.197 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
16-Feb-2022 03:55:01.197 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
16-Feb-2022 03:55:01.198 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
16-Feb-2022 03:55:01.228 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
16-Feb-2022 03:55:01.228 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
16-Feb-2022 03:55:01.229 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
16-Feb-2022 03:55:01.236 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
16-Feb-2022 03:55:03.735 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
16-Feb-2022 03:55:03.966 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [4777] milliseconds
16-Feb-2022 03:55:04.466 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
16-Feb-2022 03:55:04.467 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.56]
16-Feb-2022 03:55:04.626 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
16-Feb-2022 03:55:04.707 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [738] milliseconds

^C16-Feb-2022 03:55:46.205 INFO [Thread-2] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
16-Feb-2022 03:55:46.211 INFO [Thread-2] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
16-Feb-2022 03:55:46.216 INFO [Thread-2] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
16-Feb-2022 03:55:46.222 INFO [Thread-2] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
  • [root@YY liangjiayy]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
  • [root@YY liangjiayy]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   6 weeks ago    141MB
tomcat       9.0       b8e65a4d736d   7 weeks ago    680MB
centos       latest    5d0da3dc9764   5 months ago   231MB

  • [root@YY liangjiayy]# docker run -d -p 3355:8080 --name tomcat01 tomcat:9.0

-d:后台启动;启动运行

b7d21e10a03f0c500e3aaf6ef3f3c73b873ea32ad8019e535918295d8c9d4834
  • [root@YY liangjiayy]# docker ps
CONTAINER ID   IMAGE        COMMAND             CREATED         STATUS         PORTS                         NAMES
b7d21e10a03f   tomcat:9.0   "catalina.sh run"   6 seconds ago   Up 5 seconds   0.0.0.0:3355:3355->8080/tcp   tomcat01
  • [root@YY liangjiayy]# docker exec -it tomcat01 /bin/bash

开启一个新的命令窗口进入容器

  • root@b7d21e10a03f:/usr/local/tomcat# ls
BUILDING.txt	 NOTICE		RUNNING.txt  lib	     temp	   work
CONTRIBUTING.md  README.md	bin	     logs	     webapps
LICENSE		 RELEASE-NOTES	conf	     native-jni-lib  webapps.dist

此时通过浏览器访问:ip:3355,发现404。这是因为所有不必要的都被剔除掉了,但webapps.dist目录下有,只需复制过来

  • root@b7d21e10a03f:/usr/local/tomcat# cp -r webapps.dist/* webapps

将webapps.dist中的文件拷贝到webapps下面,再次访问,发现可以访问到内容
继续执行命令ls webapps,可得如下内容

ROOT  docs  examples  host-manager  manager

部署ES+Kibana


Docker镜像

docker commit:提交容器成为一个新的副本

  • docker commit -m=“提交的描述信息” -a=“作者” 容器id 目标镜像名:[Tag]

命令和git类似!

  • 以刚刚创建好的tomcat01为例测试
  1. 查看一下刚刚的容器
    [root@YY liangjiayy]# docker ps -a
CONTAINER ID   IMAGE        COMMAND             CREATED             STATUS             PORTS                                       NAMES
b7d21e10a03f   tomcat:9.0   "catalina.sh run"   About an hour ago   Up About an hour   0.0.0.0:3355->8080/tcp, :::3355->8080/tcp   tomcat01
  1. 提交
  • [root@YY liangjiayy]# docker commit -m="tomcat01:add webapps" -a="liangjiayy" b7d21e10a03f my_tomcat01:1.0

提交镜像
:目标镜像名不能有大写字母,例如:

  • [root@YY liangjiayy]# docker commit -m=“"tomcat01:add webapps" -a="liangjiayy" b7d21e10a03f myTomcat01:1.0
    会有如下报错
invalid reference format: repository name must be lowercase
sha256:26c81f8676b3ed7225af7b5cd10c0cad3d5d22c346e1c7d2df925808b8a3c4cc

3.查一下现在的镜像,发现有自己新创建的

  • [root@YY liangjiayy]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
my_tomcat01   1.0       26c81f8676b3   20 seconds ago   685MB
nginx         latest    605c77e624dd   6 weeks ago      141MB
tomcat        9.0       b8e65a4d736d   7 weeks ago      680MB
centos        latest    5d0da3dc9764   5 months ago     231MB

容器数据卷

容器持久化和同步操作!容器间也是可以数据共享的

使用

  • 方式一:直接用命令来挂载:
    docker run -it -v 主句目录:容器目录
    例如:
    [root@YY liangjiayy]# docker run -it -v /home/centos02:/home centos

-v 主机目录:容器内目录
可在任意一边创建or删除文件,在另一边查看
可通过docker inspect centos命令查看元数据

  • 方式二:docker file 构建镜像直接进行挂载

实战-mysql

  1. 参考狂神:
docker run -p 3310:3306 --name msql5.7 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.7
  1. 参考尚硅谷:https://www.bilibili.com/video/BV1np4y1C7Yf?p=10(多挂载了一个/var/log/mysql目录)
docker run -p 3306:3306 --name mysql -v /usr/local/mysql/data:/var/lib/mysql -v /usr/local/mysql/conf:/etc/mysql/conf.d -v /usr/local/mysql/log:/var/log/mysql  -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

-v:挂载;-e:环境,指定了root用户的密码;

Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
b0be329fe32ae0b0480f82509f25e16313e6a56ca386dd43c10a3505f1369565

就算删除这个容器,数据依然存在!

具名和匿名挂载

  • 匿名挂载

docker run -v 容器内路径 …
只指定容器内的目录,没有指明与之对应在主机的目录
可通docker volume ls命令查看
一般默认挂载在/var/lib/docker/volumes/xxx/_data目录下

  • 具名挂载

docker run -v 卷名:容器内路径 …
既指定主机目录,又指定容器内的目录
可以方便的找到卷

  • 指定路径挂载

docker run -v /主机路径:容器内路径 …

  • 拓展

-v 容器内路径:ro rw可改变读写权限
ro: readonly,只读,只能通过宿主机操作,容器内无法操作
rw: read write,可读可写

数据卷容器

两个容器之间的挂载

  • docker run … --name docker02 --volumes-from docker01 image

把docker02挂载到docker01上;image 如 centos:5.7

  • 生命周期:一直到没有容器使用为止

DockerFile

用来构建docker镜像的文件!命令参数脚本

基础知识

  1. 每个保留关键字(指令)都必须是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每个指令都会创建提交一个新的镜像层,并提交

构建步骤

  1. 编写 dockerfile 文件
  2. docker build 构建为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

dockerfile 是面向开发的,逐渐成为企业交付的标准

dockerfile: 构建文件,定义一切的步骤,源代码

dockerImages:通过dockerFile构建生成的镜像,最终发布运行产品

docker容器:镜像运行起来提供服务

dockerfile 指令

FROM

指定基础镜像

MAINTAINER

指定作者,姓名 + 邮箱

RUN

执行命令

ADD

添加文件

COPY

复制文件
用法和ADD相同

WORKDIR

配置工作目录

VOLUME

挂载本地目录或文件

EXPOSE

暴露端口

CMD

容器启动命令;
容器启动时执行的命令,只有最后一个生效

ENTRYPOINT

容器启动执行命名,直接追加

ENTRYPOINT和CMD语法相同,区别在于:

  • CMD的命令会被docker run的参数覆盖
    如:cmd命令是ls -a,运行时使用的命令是docker run -l ...,则cmd的命令会被替换成-l而不是ls -al
  • ENTRYPOINT会把参数追加在原命令后面
    如:ENTRYPOINT原命令是ls -a ,运行时命令为docker run -l ...,则ENTRYPOINT新的命令是ls -al

ONBUILD

配置当前所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令

ENV

设置环境变量
1)具有传递性,也就是当前镜像被用作其它镜像的基础镜像时,新镜像会拥有当前这个基础镜像所有的环境变量
2)ENV定义的环境变量,可以在dockerfile被后面的所有指令(CMD除外)中使用,但不能被docker run 的命令参数引用

创建自己的centos

  1. 新建文件并编辑
    vi mycentos
    编辑内容如下
FROM centos:7

MAINTAINER ljy<1@qq.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim

EXPOSE 80

CMD echo $MYPATH
CMD echo "-----------end------------"
CMD /bin/bash
  1. docker build 构建为一个镜像,命令:
    docker build -f mycentos -t mycentos:1.0 .

    • 如果使用的centos8,会出现如下报错:
      Error: Failed to download metadata for repo ‘appstream’: Cannot prepare internal mirrorlist: No URLs in mirrorlist
  2. docker run 运行镜像
    docker run -it mycentos:1.0

    可测试vim是否安装成功,输入vim --help

  3. docker push 发布镜像(本文后面)

  • 其他命令
    docker history 镜像id

    查看一个镜像的构建过程

发布镜像

注: 未制作tomcat镜像,以上面制作的mycentos镜像为例发布

发布到docker hub

  1. https://hub.docker.com/注册帐号

  2. 登录,命令:docker login -u 用户名
    例如我的是:
    docker login -u liangjiayy

  3. 发布镜像

  • 3.1 先增加标签,命令:

    docker tag 镜像id 用户名(docker hub)/镜像名:[tag]

    例如,我的是:
    docker tag 51561cfc3e65 liangjiayy/mycentos:1.0

    注:我的镜像有:
    [root@YY ~]# docker images

    REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
    mycentos     1.0       51561cfc3e65   17 hours ago   414MB
    ...
    
  • 3.2 发布到docker hub,命令:

    docker push 用户名(docker hub)/镜像名:[tag]

    例如,我的是:
    docker push liangjiayy/mycentos:1.0

    The push refers to repository [docker.io/liangjiayy/mycentos]
    d894ad333fb9: Pushed
    174f56854903: Pushed
    1.0: digest: sha256:3c7b47fb28f67b8cdfee0d80f1d833a4e3bd41a11577c8a1a2ebf436970e0b94 size: 741
    

    网页端登录docker hub,点击Repositories ,可以看到刚刚发布的镜像
    在这里插入图片描述

  1. 退出登录
    docker logout

发布到阿里云容器服务


  1. 点右上角控制台
    在这里插入图片描述
  2. 点最左边的三条横线
    在这里插入图片描述
  3. 找容器镜像服务
    在这里插入图片描述
  4. 如果是这样的,点个人认证,按提示新建一个
    在这里插入图片描述
  5. 进入个人实例在这里插入图片描述

  • 新建命名空间(一个账号最多可以创建 3 个命名空间)
    在这里插入图片描述
  • 创镜像仓库,填入必填项,点下一步
    在这里插入图片描述
    创建本地仓库
    在这里插入图片描述
  • 官方步骤:
  1. 登录阿里云Docker Registry
    $ docker login --username=liangj**** registry.cn-hangzhou.aliyuncs.com
    用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
    您可以在访问凭证页面修改凭证密码。

  2. 从Registry中拉取镜像
    $ docker pull registry.cn-hangzhou.aliyuncs.com/ljy-docker/test:[镜像版本号]

  3. 将镜像推送到Registry
    $ docker login --username=liangj**** registry.cn-hangzhou.aliyuncs.com
    $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/ljy-docker/test:[镜像版本号]
    $ docker push registry.cn-hangzhou.aliyuncs.com/ljy-docker/test:[镜像版本号]
    请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。

  4. 选择合适的镜像仓库地址
    从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。
    如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。

  5. 示例
    使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。
    $ docker images
    REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
    registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB
    $ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
    使用 “docker push” 命令将该镜像推送至远程。
    $ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值