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/
-
yum安装gcc相关环境(需要确保虚拟机可以上外网 )
yum -y install gcc yum -y install gcc-c++
-
卸载旧版本
sudo yum remove docker \\ docker-client \\ docker-client-latest \\ docker-common \\ docker-latest \\ docker-latest-logrotate \\ docker-logrotate \\ docker-engine
-
安装需要的软件包
sudo yum install -y yum-utils
-
设置镜像仓库
官网(国外):
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
-
安装 Docker CE
yum install docker-ce docker-ce-cli containerd.io
-
启动 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
常用命令总结
命令 | 官方说明 | 解释 |
---|---|---|
attach | Attach local standard input, output, and error streams to a running container | 当前 shell 下 attach 连接指定运行镜像 |
build | Build an image from a Dockerfile | 通过 Dockerfile 定制镜像 |
commit | Create a new image from a container’s changes | 提交当前容器为新的镜像 |
cp | Copy files/folders between a container and the local filesystem | 从容器中拷贝指定文件或者目录到宿主机中 |
create | Create a new container | 创建一个新的容器,同 run,但不启动容器 |
diff | Inspect changes to files or directories on a container’s filesystem | 查看 docker 容器变化 |
events | Get real time events from the server | 从 docker 服务获取容 器实时事件 |
exec | Run a command in a running container | 在已存在的容器上运行命令 |
export | Export a container’s filesystem as a tar archive | 导出容器的内 容流作为一个 tar 归档文件[对应 import ] |
history | Show the history of an image | 展示一个镜像形成历史 |
images | List images | 列出系统当前镜像 |
import | Import the contents from a tarball to create a filesystem image | 从 tar包中的内容创建一个新的文件系统映像[对应export] |
info | Display system-wide information | 显示系统相关信息 |
inspect | Return low-level information on Docker objects | 查看容器详细信息 |
kill | Kill one or more running containers | 杀掉 指定 docker 容器 |
load | Load an image from a tar archive or STDIN | 从一个 tar 包中加载一 个镜像[对应 save] |
login | Log in to a Docker registry | 登陆一个 docker 源服务器 |
logout | Log out from a Docker registry | 从当前 Docker registry 退出 |
logs | Fetch the logs of a container | 输出当前容器日志信息 |
pause | Pause all processes within one or more containers | 暂停容器 |
port | List port mappings or a specific mapping for the container | 查看映射端口对应的容器内部源端口 |
ps | List containers | 列出容器列表 |
pull | Pull an image or a repository from a registry | 从docker镜像源服务器拉取指定镜像或者库镜像 |
push | Push an image or a repository to a registry | 推送指定镜像或者库镜像至docker源服务器 |
rename | Rename a container | 给一个容器改名 |
restart | Restart one or more containers | 重启运行的容器 |
rm | Remove one or more containers | 移除一个或者多个容器 |
rmi | Remove one or more images | 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或 -f 强制删除] |
run | Run a command in a new container | 创建一个新的容器并运行 一个命令 |
save | Save one or more images to a tar archive (streamed to STDOUT by default) | 保存一个镜像为一个 tar 包[对应 load] |
search | Search the Docker Hub for images | 在 docker hub 中搜 索镜像 |
start | Start one or more stopped containers | 启动容器 |
stats | Display a live stream of container(s) resource usage statistics | 显示容器资源使用统计信息的实时信息 |
stop | Stop one or more running containers | 停止容器 |
tag | Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE | 给源中镜像打标签 |
top | Display the running processes of a container | 查看容器中运行的进程信 息 |
unpause | Unpause all processes within one or more containers | 取消暂停容器 |
update | Update configuration of one or more containers | 更新容器配置 |
version | Show the Docker version information | 查看 docker 版本号 |
wait | Block 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
- 访问:
首次加载比较慢,且登陆需要注册用户,给admin用户设置密码:
单机版这里选择local即可,选择完毕,点击Connect即可连接到本地docker:
Docker 镜像和仓库
Docker镜像
镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含 运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
Docker镜像加载原理
UnionFS (联合文件系统)
UnionFS 是一种分层、轻量级并且高性能的文件系统, 它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录
镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
典型的Linux文件系统由bootfs和rootfs两部分组成
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 不会在容器删除时删除其挂载的数据卷。
特点:
- 数据卷可在容器之间共享或重用数据
- 卷中的更改可以直接生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
一句话: 就是容器的持久化,以及容器间的继承和数据共享!
使用数据卷
指令 v 方式
方式一:容器中直接使用命令来添加
在用 docker run 命令的时候,使用 -v 标记来创建一个数据
以上是关于docker入门详细笔记的主要内容,如果未能解决你的问题,请参考以下文章