docker入门详细笔记

Posted 吹灭读书灯 一身都是月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker入门详细笔记相关的知识,希望对你有一定的参考价值。

这个笔记是狂神说的docker基础篇视频的对应的笔记:https://www.bilibili.com/video/BV1og4y1q7M4
进阶视频:https://www.bilibili.com/video/BV1kv411q7Qc
转载链接:Oddfar Note ;有一说一,他们的博客是真滴好看
也可参考:https://www.pdai.tech/md/devops/docker/docker-01-docker-vm.html

Docker安装

我们使用的是 CentOS 7 (64-bit)

Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。

查看自己的内核:

用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型 等)。

uname -r

查看版本信息:

cat /etc/os-release

安装步骤

官网安装参考手册:https://docs.docker.com/engine/install/centos/

  1. yum安装gcc相关环境(需要确保虚拟机可以上外网 )

    yum -y install gcc
    yum -y install gcc-c++
    
  2. 卸载旧版本

    sudo yum remove docker \\
                      docker-client \\
                      docker-client-latest \\
                      docker-common \\
                      docker-latest \\
                      docker-latest-logrotate \\
                      docker-logrotate \\
                      docker-engine
    
  3. 安装需要的软件包

    sudo yum install -y yum-utils
    
  4. 设置镜像仓库

    官网(国外):

    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
    
  5. 更新yum软件包索引

    yum makecache fast
    
  6. 安装 Docker CE

    yum install docker-ce docker-ce-cli containerd.io
    
  7. 启动 Docker

    systemctl start docker
    

    至此,已经安装完

  • 查看版本

    docker version
    
  • 查看安装的镜像

    docker images
    
  • 测试运行hello

    docker run hello-world
    

卸载docker

systemctl stop docker
yum -y remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

阿里云镜像加速

介绍:https://www.aliyun.com/product/acr

查看自己的镜像加速器并配置

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://cbl6xdl3.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器

测试 HelloWorld

启动hello-world

docker run hello-world

run干了什么?

Docker - 常用命令

帮助命令

docker version # 显示 Docker 版本信息。
docker info # 显示 Docker 系统信息,包括镜像和容器数。
docker --help # 帮助

镜像命令

docker images

列出本地主机上的镜像

解释:

  • REPOSITORY 镜像的仓库源
  • TAG 镜像的标签
  • IMAGE ID 镜像的ID
  • CREATED 镜像创建时间
  • SIZE 镜像大小

同一个仓库源可以有多个 TAG,代表这个仓库源的不同版本,我们使用 REPOSITORY:TAG 定义不同的镜像,如果你不定义镜像的标签版本,docker将默认使用 latest 镜像!

docker search

搜索镜像:

docker search 某个镜像的名称 对应DockerHub仓库中的镜像

docker search mysql

可选项:

列出收藏数不小于指定值的镜像,例如

docker search mysql --filter=stars=1000

  • NAME: 镜像仓库源的名称
  • DESCRIPTION: 镜像的描述
  • OFFICIAL: 是否 docker 官方发布
  • STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
  • AUTOMATED: 自动构建。

也通过Docker Hub 进行查找

比如https://hub.docker.com/search?q=mysql&type=image

docker pull

下载镜像

不写tag,默认是latest

docker pull mysql

指定版本下载

docker pull mysql:5.7

docker rmi

删除镜像

docker rmi -f 镜像id # 删除单个
docker rmi -f 镜像名:tag 镜像名:tag # 删除多个

删除全部

docker rmi -f $(docker images -qa)

容器命令

有镜像才能创建容器,我们这里使用 centos 的镜像来测试,就是虚拟一个 centos !

docker pull centos

容器启动

docker run [OPTIONS] IMAGE [COMMAND][ARG...]

常用参数说明

参数说明
–name=“Name”给容器指定一个名字 之后再对容器操作,可以用这个name,相当于“别名”
-d后台方式运行容器,并返回容器的id!
-i以交互模式运行容器,通过和 -t 一起使用
-t给容器重新分配一个终端,通常和 -i 一起使用
-P随机端口映射(大写)
-p指定端口映射(小写),一般可以有四种写法
-p 指定容器的端口  -p 8080:8080
      -p ip:主机端口:容器端口
      -p 主机端口:容器端口(常用)
      -p 容器端口
      容器端口

查看镜像:

启动一个容器,使用centos进行用交互模式启动容器,在容器内执行/bin/bash命令!

docker run -it centos /bin/bash

退出容器:

容器查看

docker ps [OPTIONS]

常用参数说明

参数说明
-a列出当前所有正在运行的容器 + 历史运行过的容器
-l显示最近创建的容器
-n=?显示最近n个创建的容器
-q静默模式,只显示容器编号。

退出容器

指令说明
exit容器停止退出
ctrl+P+Q容器不停止退出

启动停止容器

指令说明
docker start (容器id or 容器名)启动容器
docker restart (容器id or 容器名)重启容器
docker stop (容器id or 容器名)停止容器
docker kill (容器id or 容器名)强制停止容器

删除容器

指令说明
docker rm 容器id删除指定容器,不能删除正在运行的容器,如果要强制删除使用rm -f
docker rm -f $(docker ps -a -q)删除所有容器
docker ps -a -q | xargs docker rm删除所有容器

容器再启动

docker start id/name

启动之前停止关闭的容器

后台启动容器

docker run -d 容器名

启动centos,使用后台方式启动,例如:

docker run -d centos

问题: 使用docker ps 查看,发现容器已经退出了!

解释:Docker容器后台运行,就必须有一个前台进程,容器运行的命令如果不是那些一直挂起的命令,就会自动退出。

比如,你运行了nginx服务,但是docker前台没有运行应用,这种情况下,容器启动后,会立即自杀,因为他觉得没有程序了,所以最好的情况是,将你的应用使用前台进程的方式运行启动。

清理停止的容器

清理停止的容器:

docker container prune

查看日志

docker logs -f -t --tail 容器id

例子:我们启动 centos,并编写一段脚本来测试玩玩!最后查看日志

docker run -d centos /bin/sh -c "while true;do echo hello;sleep 1;done"

查看日志:

docker logs 容器id
参数说明
-t显示时间戳
-f打印最新的日志
–tail数字显示多少条!
docker logs -tf --tail 10 87f5e5a2954e

  • 停止运行
docker stop 87f5e5a2954e

  • 查看正在运行容器的进程信息
docker top 容器id
  • 查看容器/镜像的元数据
docker inspect 容器id

进入正在运行的容器

命令一:

docker exec -it 容器id bashShell

例如:

[root@VM-0-6-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@VM-0-6-centos ~]# docker run -d centos /bin/sh -c "while true;do echo hello;sleep 1;done"
a9b967bdbc870bb039b69c76ddc3d3ce6aa87d57c51a8040e32224fb45576b28
[root@VM-0-6-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
a9b967bdbc87   centos    "/bin/sh -c 'while t…"   8 seconds ago   Up 7 seconds             upbeat_haibt
[root@VM-0-6-centos ~]# docker exec -it a9b967bdbc87 /bin/bash
[root@a9b967bdbc87 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 10:01 ?        00:00:00 /bin/sh -c while true;do echo hello;sleep 1;done
root        37     0  0 10:02 pts/0    00:00:00 /bin/bash
root        59     1  0 10:02 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root        60    37  0 10:02 pts/0    00:00:00 ps -ef

退出容器终端,不会导致容器的停止

[root@a9b967bdbc87 /]# exit
exit
[root@VM-0-6-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
a9b967bdbc87   centos    "/bin/sh -c 'while t…"   7 minutes ago   Up 7 minutes             upbeat_haibt

命令二:

docker attach 容器id

测试:

[root@VM-0-6-centos ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   2 months ago   13.3kB
centos        latest    300e315adb2f   5 months ago   209MB
[root@VM-0-6-centos ~]# docker  run -it -d  centos /bin/bash
7f9ead6f906b3c691d29866236414e1808d194462ed0839c8ee5c947d731ed57
[root@VM-0-6-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS         PORTS     NAMES
7f9ead6f906b   centos    "/bin/bash"   10 seconds ago   Up 9 seconds             nervous_mcclintock
[root@VM-0-6-centos ~]# docker attach 7f9ead6f906b
[root@7f9ead6f906b /]# echo "hello"
hello
[root@7f9ead6f906b /]# exit
exit
[root@VM-0-6-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@VM-0-6-centos ~]# 

区别 :

  • docker exec 是在容器中打开新的终端,并且可以启动新的进程
  • docker attach 直接进入容器启动命令的终端,不会启动新的进程

推荐大家使用 docker exec 命令

容器内拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机路径

例如:将容器中的f1文件拷贝出到 虚拟机的/home目录

docker cp 7f9ead6f906b:/home/f1 /home

常用命令总结

命令官方说明解释
attachAttach local standard input, output, and error streams to a running container当前 shell 下 attach 连接指定运行镜像
buildBuild an image from a Dockerfile通过 Dockerfile 定制镜像
commitCreate a new image from a container’s changes提交当前容器为新的镜像
cpCopy files/folders between a container and the local filesystem从容器中拷贝指定文件或者目录到宿主机中
createCreate a new container创建一个新的容器,同 run,但不启动容器
diffInspect changes to files or directories on a container’s filesystem查看 docker 容器变化
eventsGet real time events from the server从 docker 服务获取容 器实时事件
execRun a command in a running container在已存在的容器上运行命令
exportExport a container’s filesystem as a tar archive导出容器的内 容流作为一个 tar 归档文件[对应 import ]
historyShow the history of an image展示一个镜像形成历史
imagesList images列出系统当前镜像
importImport the contents from a tarball to create a filesystem image从 tar包中的内容创建一个新的文件系统映像[对应export]
infoDisplay system-wide information显示系统相关信息
inspectReturn low-level information on Docker objects查看容器详细信息
killKill one or more running containers杀掉 指定 docker 容器
loadLoad an image from a tar archive or STDIN从一个 tar 包中加载一 个镜像[对应 save]
loginLog in to a Docker registry登陆一个 docker 源服务器
logoutLog out from a Docker registry从当前 Docker registry 退出
logsFetch the logs of a container输出当前容器日志信息
pausePause all processes within one or more containers暂停容器
portList port mappings or a specific mapping for the container查看映射端口对应的容器内部源端口
psList containers列出容器列表
pullPull an image or a repository from a registry从docker镜像源服务器拉取指定镜像或者库镜像
pushPush an image or a repository to a registry推送指定镜像或者库镜像至docker源服务器
renameRename a container给一个容器改名
restartRestart one or more containers重启运行的容器
rmRemove one or more containers移除一个或者多个容器
rmiRemove one or more images移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除]
runRun a command in a new container创建一个新的容器并运行 一个命令
saveSave one or more images to a tar archive (streamed to STDOUT by default)保存一个镜像为一个 tar 包[对应 load]
searchSearch the Docker Hub for images在 docker hub 中搜 索镜像
startStart one or more stopped containers启动容器
statsDisplay a live stream of container(s) resource usage statistics显示容器资源使用统计信息的实时信息
stopStop one or more running containers停止容器
tagCreate a tag TARGET_IMAGE that refers to SOURCE_IMAGE给源中镜像打标签
topDisplay the running processes of a container查看容器中运行的进程信 息
unpauseUnpause all processes within one or more containers取消暂停容器
updateUpdate configuration of one or more containers更新容器配置
versionShow the Docker version information查看 docker 版本号
waitBlock until one or more containers stop, then print their exit codes截取容器停止时的退出状态值

Docker安装练习

练习

安装nginx

拉取镜像:

$ docker pull nginx


启动容器:

-d 后台启动

  • 3500为外网访问地址:注意阿里云开放端口以及开防火墙firewall-cmd --zone=public --add-port=3500/tcp --permanent
  • 重启防火墙firewall-cmd --reload
docker run -d --name mynginx -p 3500:80 nginx

本机测试:curl localhost:3500

进入容器:

[root@VM-0-6-centos ~]# docker exec -it mynginx /bin/bash
# 寻找nginx
root@511741b161de:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@511741b161de:/# cd /usr/share/nginx
root@511741b161de:/usr/share/nginx# ls
html
root@511741b161de:/usr/share/nginx# cd html
root@511741b161de:/usr/share/nginx/html# ls
50x.html  index.html
#可看到之前访问的内容是 index.html
root@511741b161de:/usr/share/nginx/html# cat index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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

在 docker hub 官网搜索 tomcat:https://hub.docker.com/_/tomcat

翻到下面有教程

docker run -it --rm tomcat:9.0   # 仅测试使用:关闭之后使用docker ps 找不到
  • -it :交互模式
  • –rm:容器启动成功并退出以后容器就自动移除,一般只在测试情况下使用!

1、下载tomcat镜像:

docker pull tomcat

2、启动

docker run -d -p 8080:8080 --name tomcat9 tomcat

3、进入tomcat

docker exec -it tomcat9 /bin/bash

进入后发现,webapps 里什么也没有,默认是最小的镜像,所有不必要的剔除。

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

若部署一个 jsp 网站,需要把文件复制到容器里,非常麻烦。

我们可以通过“数据卷”技术,将容器内文件和我们 Linux 文件进行映射挂载。

部署ElasticSearch

官网:https://hub.docker.com/_/elasticsearch

1、启动:

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

2、查看状态

  • docker stats 容器id

    查看容器的cpu内存和网络状态

查看下cpu状态 ,发现占用的很大

3、增加上内存限制启动

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

启动时,报错:名字已经存在

可通过指令删除

  • docker rm name_of_the_docker_container
docker rm elasticsearch

我们可通过 docker ps -a显示所有容器信息

再次启动后,发现内存变小了

访问成功:

[root@VM-0-6-centos ~]# curl localhost:9200
{
  "name" : "d49fb1463f0a",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "ycGNdXS0TpC2lcOfIFlPkQ",
  "version" : {
    "number" : "7.6.2",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
    "build_date" : "2020-03-26T06:34:37.794943Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

关于名字的作用:

以后我们想启动上次配置的 ElasticSearch,用 docker start 容器名字 即可,不需要在重新配置

[root@VM-0-6-centos ~]# docker start elasticsearch
elasticsearch
[root@VM-0-6-centos ~]# docker ps
CONTAINER ID   IMAGE                 COMMAND                  CREATED             STATUS         PORTS                                                                                  NAMES
d49fb1463f0a   elasticsearch:7.6.2   "/usr/local/bin/dock…"   About an hour ago   Up 5 seconds   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   elasticsearch
[root@VM-0-6-centos ~] # 

如果我们要使用 kibana , 如果配置连接上我们的es呢?网络该如何配置呢?

可视化

Portainer(Rancher)是Docker的图形化管理工具,提供状态显示面板、应用模板快速部署、容器镜像网络数据卷 的基本操作(包括上传下载镜像,创建容器等操作)、事件日志显示、容器控制台操作、Swarm集群和 服务等集中管理和操作、登录用户管理和控制等功能。功能十分全面,基本能满足中小型单位对容器管理的全部需求。

如果仅有一个docker宿主机,则可使用单机版运行,Portainer单机版运行十分简单,只需要一条语句即可启动容器,来管理该机器上的 docker 镜像、容器等数据。

  • 安装并运行Portainer:
docker run -d -p 8088:9000 
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
  • 访问:

http://IP:8088

首次加载比较慢,且登陆需要注册用户,给admin用户设置密码:

单机版这里选择local即可,选择完毕,点击Connect即可连接到本地docker:

Docker 镜像和仓库

Docker镜像

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含 运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

Docker镜像加载原理

UnionFS (联合文件系统)

UnionFS 是一种分层、轻量级并且高性能的文件系统, 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

镜像加载原理

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

典型的Linux文件系统由bootfsrootfs两部分组成

bootfs(boot file system)主要包含 bootloader 和 kernel , bootloader 主要是引导加载 kernel, Linux 刚启动时会加载bootfs文件系统,在Docker镜像的最底层是 bootfs。这一层与我们典型的 Linux/Unix 系统是 一样的,包含boot 加载器和内核。当 boot 加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs 转交给内核,此时系统也会卸载 bootfs。

rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?

对于一个精简的系统,rootfs 可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供 rootfs 就可以了。由此可见对于不同的 linux 发行版, bootfs 基本是一 致的, rootfs 会有差别, 因此不同的发行版可以公用 bootfs。

分层理解

我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层的在下载!

为什么Docker镜像要采用这种分层的结构呢?

最大的好处,莫过于是资源共享了!比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务了,而且镜像的每一层都可以被共享。

查看镜像分层的方式可以通过 docker image inspect命令!

docker image inspect tomcat:latest

所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。

举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果在该镜像中添加 Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层。

该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了 一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件。

上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。

下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件 7 是文件 5 的一个更新版本。

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。

Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统 一的文件系统。

Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW。

下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

特点:

Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都叫镜像层!

提交镜像

docker commit 从容器创建一个新的镜像。

  • 语法:

    docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
    

测试

1、从Docker Hub 下载 tomcat 镜像到本地并运行

-it 交互终端 -p 端口映射

docker run -it -p 8080:8080 tomcat

2、访问地址

docker启动官方tomcat镜像的容器,发现404是因为使用了加速器,而加速器里的 tomcat的webapps下没有root等文件!

[root@VM-0-6-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                                       NAMES
a8b6aff64fa3   tomcat    "catalina.sh run"   8 minutes ago   Up 8 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   silly_feynman
[root@VM-0-6-centos ~]# docker exec -it a8b6aff64fa3 /bin/bash
root@a8b6aff64fa3:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE	NOTICE	README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work

进入 tomcat 查看 cd 到 webapps 下发现全部空的,反而有个 webapps.dist 里有对应文件

root@a8b6aff64fa3:/usr/local/tomcat# cd webapps.dist
root@a8b6aff64fa3:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager

我们可以 cp -r 复制文件到webapps下!

root@a8b6aff64fa3:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@a8b6aff64fa3:/usr/local/tomcat# cd webapps
root@a8b6aff64fa3:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager

此时再次访问,则不是404

**3、提交修改后的镜像为 tomcat02 **

下次则可以直接启动这个

注意:commit的时候,容器的名字不能有大写,否则报错:invalid reference format

[root@VM-0-6-centos ~]# docker ps -l
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                                       NAMES
a8b6aff64fa3   tomcat    "catalina.sh run"   16 minutes ago   Up 16 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   silly_feynman
##提交镜像
[root@VM-0-6-centos ~]# docker commit -a="zhiyuan" -m="new tomcat" a8b6aff64fa3 tomcat02:1.1
sha256:620813976effbc8a7e36398a9b801891d1654dea37a50927b36a950ffe21a63b
[root@VM-0-6-centos ~]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
tomcat02              1.1       620813976eff   8 seconds ago   672MB

停止后再启动看看,首页可访问

[root@VM-0-6-centos ~]# docker stop a8b6aff64fa3
a8b6aff64fa3
[root@VM-0-6-centos ~]# docker run -it -p 8080:8080 tomcat02:1.1

Docker 仓库

DockerHub

注册dockerhub https://hub.docker.com/signup

1、登录

docker login -u oddfar

2、将镜像发布出去

[root@VM-0-6-centos logs]# docker push hello-world
Using default tag: latest
The push refers to repository [docker.io/library/hello-world]
f22b99068db9: Layer already exists 
errors:
denied: requested access to the resource is denied
unauthorized: authentication required

错误:请求的资源访问被拒绝

问题:本地镜像名无帐号信息,解决加 tag 即可

[root@VM-0-6-centos logs]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED             SIZE
hello-world           latest  	  d1165f221234   3 months ago        13.3kB
[root@VM-0-6-centos logs]# docker tag d1165f221234 oddfar(用户名)/hello-world(镜像名):1.08(标签)	

oddfar 是我的用户名

3、再次push

[root@VM-0-6-centos logs]# docker push oddfar/hello-world:1.0

访问:https://hub.docker.com/ 可看到提交的镜像

阿里云镜像服务

登录阿里云 -> 找到容器镜像服务 -> 创建命名空间 -> 创建镜像仓库

点击进入这个镜像仓库,可以看到所有的信息


指令:

测试:推送 hello-world

[root@VM-0-6-centos ~]# docker login --username=a_zhiyuan registry.cn-hangzhou.aliyuncs.com
[root@VM-0-6-centos ~]# docker tag d1165f221234 registry.cn-hangzhou.aliyuncs.com/zhiyuan/study:1.0
[root@VM-0-6-centos ~]# docker push registry.cn-hangzhou.aliyuncs.com/zhiyuan/study:1.0

提交成功

Docker 数据卷

什么是数据卷

数据卷(Data Volume)

docker的理念回顾:

将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够 持久化的!

就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这TM也太扯了吧!

所以我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!

为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!

作用:

卷就是目录或者文件,存在一个或者多个容器中,由 docker 挂载到容器,但不属于联合文件系统,因此能够绕过 Union File System , 提供一些用于持续存储或共享数据的特性。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此 Docker 不会在容器删除时删除其挂载的数据卷。

特点:

  1. 数据卷可在容器之间共享或重用数据
  2. 卷中的更改可以直接生效
  3. 数据卷中的更改不会包含在镜像的更新中
  4. 数据卷的生命周期一直持续到没有容器使用它为止

一句话: 就是容器的持久化,以及容器间的继承和数据共享!

使用数据卷

指令 v 方式

方式一:容器中直接使用命令来添加

在用 docker run 命令的时候,使用 -v 标记来创建一个数据

以上是关于docker入门详细笔记的主要内容,如果未能解决你的问题,请参考以下文章

HTML入门学习笔记+详细案例

用AOP统一记录日志(详细笔记入门)

用AOP统一记录日志(详细笔记入门)

用AOP统一记录日志(详细笔记入门)

Docker容器-入门级

牛逼!Docker从入门到上瘾