Docker
Docker 是一种开源的容器化平台,用于开发、部署和运行应用程序。它允许开发者将应用程序及其所有依赖项打包到一个可移植的容器中,这个容器可以在任何支持 Docker 的环境中运行,无论是开发人员的个人笔记本电脑、测试环境、生产服务器还是云环境。
以下是 Docker 的一些主要特性和概念:
-
容器化技术: Docker 使用容器化技术,通过隔离进程和资源来打包应用程序及其依赖项。每个容器都是一个独立的运行环境,与宿主系统隔离,但与其他容器共享主机内核。这使得容器能够在各种环境中以一致的方式运行。
-
轻量级: 容器相对于传统的虚拟机来说更为轻量级,因为它们共享主机操作系统的内核,无需启动完整的操作系统实例。这使得容器的启动速度更快,占用更少的系统资源。
-
可移植性: Docker 容器可以在任何支持 Docker 的环境中运行,无论是在开发者的本地开发环境、测试环境还是生产服务器,以及公有云或私有云环境。
-
易于部署: Docker 容器可以通过 Docker 镜像进行部署。镜像是一个只读的模板,包含了运行容器所需的所有内容,包括代码、运行时环境、库、环境变量等。开发者可以轻松地创建、共享和更新镜像,使得应用程序的部署变得简单和可重复。
-
可扩展性: Docker 提供了丰富的 API 和生态系统,使得开发者可以扩展和定制 Docker 功能,满足特定的需求。
总的来说,Docker 提供了一种简单而强大的方式来打包、交付和运行应用程序,使得开发者能够更快速、更可靠地构建和部署软件。
1、安装Docker
1、官网安装参考手册:https://docs.docker.com/engine/install/centos/
2、保证操作系统环境符合要求
3、卸载旧的docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
4、国内服务器安装需要配置仓库地址
sudo yum install -y yum-utils
# 外网地址 卡
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
#国内镜像
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、安装docker
#更新yum索引
yum makecache fast
#安装docker
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
6、启动与测试
sudo systemctl start docker
sudo docker run hello-world
7、卸载
systemctl stop docker
sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
2、镜像源配置
服务器在国内的,需要配置镜像源,提升下载速度。在服务器所在的云平台中搜索"容器镜像服务"。找到其中的镜像加速器。根据提示设置加速镜像源。
以华为云为例:(每个人加速器的地址不同)
执行docker info,当Registry Mirrors字段的地址为加速器的地址时,说明加速器已经配置成功。
[root@hcss-ecs-8f46 ~]# docker info
Client: Docker Engine - Community
Version: 25.0.4
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.13.0
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.24.7
Path: /usr/libexec/docker/cli-plugins/docker-compose
。。。
Registry Mirrors:
https://xxxxxxxxxxxxxxxxxxxx.mirror.swr.myhuaweicloud.com/
Live Restore Enabled: false
3、Hello-World 干了什么
使用 “sudo docker run hello-world” 完成了什么事?
1、寻找镜像(在本地仓库寻找镜像,存在则通过镜像启动容器,不存在则去dockerhub仓库寻找并下载镜像)
2、下载镜像(存在则下载到本地,不存在则超时报错 )
Unable to find image 'asfiuhfiasufhawfasgijig:latest' locally
docker: Error response from daemon: pull access denied for asfiuhfiasufhawfasgijig, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.
3、仓库-镜像-容器
4、查看本地存在的镜像
[root@hcss-ecs-8f46 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 10 months ago 13.3kB
4、Docker命令
docker version
docker info #查看docker详细信息
1、帮助命令
docker --help
Common Commands:
run Create and run a new container from an image
exec Execute a command in a running container
ps List containers
build Build an image from a Dockerfile
pull Download an image from a registry
push Upload an image to a registry
images List images
login Log in to a registry
logout Log out from a registry
search Search Docker Hub for images
version Show the Docker version information
info Display system-wide information
Management Commands:
builder Manage builds
buildx* Docker Buildx (Docker Inc., v0.13.0)
compose* Docker Compose (Docker Inc., v2.24.7)
container Manage containers
context Manage contexts
image Manage images
manifest Manage Docker image manifests and manifest lists
network Manage networks
plugin Manage plugins
system Manage Docker
trust Manage trust on Docker images
volume Manage volumes
Swarm Commands:
swarm Manage Swarm
Commands:
attach Attach local standard input, output, and error streams to a running container
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
diff Inspect changes to files or directories on a container's filesystem
events Get real time events from the server
export Export a container's filesystem as a tar archive
history Show the history of an image
import Import the contents from a tarball to create a filesystem image
inspect Return low-level information on Docker objects
kill Kill one or more running containers
load Load an image from a tar archive or STDIN
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
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
save Save one or more images to a tar archive (streamed to STDOUT by default)
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
wait Block until one or more containers stop, then print their exit codes
Global Options:
--config string Location of client config files (default "/root/.docker")
-c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with
"docker context use")
-D, --debug Enable debug mode
-H, --host list Daemon socket to connect to
-l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/root/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit
2、镜像命令
docker images 展示列表
- docker images -a 展示所有镜像
- docker images -q 只展示镜像的id
- docker images -aq 展示所有镜像的id
docker search 搜索镜像
- docker search 镜像名称
- docker search 镜像名称 --filter=Stars=50 收藏数大于50的镜像
docker pull 拉取镜像
- docker pull 镜像名称:版本号 不带版本号则拉取最新版本
docker rmi 删除镜像
- docker rmi 镜像名称/id(不一定输全,唯一即可)
- docker rmi -f 镜像名称 强制删除
- docker rmi -f $(docker images -aq) 删除所有镜像
3、容器命令
**docker run -itd 镜像名 ** 运行并在后台执行一个镜像
- -d 后台启动
- -i 让容器以交互的方式启动
- -t 给容器分配一个终端使用
- -p 指定端口映射
- -P 随机暴露一个端口
查看容器命令
- docker ps 查看运行的容器
- docker ps -a 查看所有容器
- docker ps -q 只查看id
# 运行并进入一个centos
docker run -itd centos
#进入容器内部后。exit退出容器,会停止运行该容器,使用Ctrl+P+Q,不会停止运行容器
#如果容器没有前台程序,-d后台启动后,仍旧无法保持容器启动状态
docker run -d centos
启动停止删除容器命令
- docker start 容器名称/id 启动
- docker restart 容器名称/id 重启
- docker stop 容器名称/id 停止
- docker kill 容器名称/id 强制停止
- docker rm 容器名称/id 删除
- docker rm -f 容器名称/id 强制删除
- docker rmi -f $(docker ps -aq) 强制删除所有容器
4、其他常用命令
日志文件
- docker logs
- docker logs -tf 容器名称/id t时间戳,f打印最新日志
root@hcss-ecs-8f46 ~]# docker run -d centos /bin/sh -c "while true; do echo dayinlog;sleep 1;done"
8eb953c156567ebb444c61db8549e41abc1b655c29789df7cf0bc27c1eefd1fb
[root@hcss-ecs-8f46 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8eb953c15656 centos "/bin/sh -c 'while t…" 3 seconds ago Up 3 seconds infallible_mendel
8cc23452f957 centos "/bin/bash" 14 minutes ago Up 14 minutes relaxed_wilbur
[root@hcss-ecs-8f46 ~]# docker logs -tf --tail 10 8eb953c15656
2024-03-13T11:41:36.417181845Z dayinlog
2024-03-13T11:41:37.418470622Z dayinlog
2024-03-13T11:41:38.420130400Z dayinlog
2024-03-13T11:41:39.421476353Z dayinlog
2024-03-13T11:41:40.423128221Z dayinlog
2024-03-13T11:41:41.424750606Z dayinlog
2024-03-13T11:41:42.426067446Z dayinlog
2024-03-13T11:41:43.427389098Z dayinlog
2024-03-13T11:41:44.428763016Z dayinlog
进程命令
- docker top 容器名称/id
产看容器源数据 (经常使用)
能看到容器的镜像、日志、配置等详细数据
- docker inspect 容器名称/id
进入容器
-
docker exec -it 容器名称/id /bin/bash
-
docker attach 容器名称/id 进入容器正在执行的终端,
如果容器在执行死循环,则退不出来(卡死),例:
docker run -d centos /bin/sh -c "while true; do echo dayinlog;sleep 1;done"
拷贝
docker cp 容器id:/容器路径 宿主机路径
- docker cp id:/home/test.go /root
5.一个简单的应用示例
启动nginx,并通过服务器ip:端口号的形式访问nginx初始页面
docker run -d --name my-Nginx -p 3500:80 nginx
#进入容器
docker exec -it my-Nginx /bin/bash
5.docker可视化界面
开放给公网的9000端口。docker自集成的一个可视化界面
[root@hcss-ecs-8f46 ~]# docker run -p 9000:9000 -p 8000:8000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v /mydata/portainer/data:/data -d portainer/portainer:linux-amd64-2.0.1
# 安装并运行
Unable to find image 'portainer/portainer:linux-amd64-2.0.1' locally
linux-amd64-2.0.1: Pulling from portainer/portainer
b890dbc4eb27: Pull complete
81378af8dad0: Pull complete
Digest: sha256:77917f339201db91aa25e9498bc130aaf46faa69d16c78088d422df85ce114b1
Status: Downloaded newer image for portainer/portainer:linux-amd64-2.0.1
ae910af73e4f3af40568812a09cbe1af316dd9db3178849c31ba0a4a42cf2745
[root@hcss-ecs-8f46 ~]#
6.docker镜像底层分析
Docker 镜像加载涉及到一系列步骤和概念。下面是一个简要的概述:
-
Docker 镜像是什么?
Docker 镜像是一个只读的模板,它包含了创建 Docker 容器所需的所有文件和元数据。镜像可以包含操作系统、应用程序和相关依赖。 -
镜像的存储和分发
Docker 镜像存储在 Docker Registry 中,比如 Docker Hub。当你使用docker pull
命令时,Docker 会从 Registry 中下载镜像到本地。这个过程通常是通过 HTTP 或 HTTPS 进行的。 -
镜像加载
当你使用docker run
命令来启动一个容器时,如果指定的镜像在本地不存在,Docker 会自动从 Registry 下载该镜像。然后,Docker 将这个镜像加载到本地的文件系统中。 -
联合文件系统 (Union File System)
Docker 使用联合文件系统来构建镜像。这意味着一个镜像可以由多个文件系统层组成,每个文件系统层都可以看作是一个增量改变。当你启动一个容器时,Docker 会将这些文件系统层叠加在一起,使其看起来像一个完整的文件系统。 -
容器启动
一旦镜像加载到本地,Docker 就可以使用这个镜像来创建和运行容器。容器是镜像的运行实例,它可以被启动、停止、删除等操作。
docker inspect centos
#能看到镜像分片下载的片段。每一个片段可以复用,当其他镜像使用该片段时,不会重复下载
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:9eb82f04c782ef3f5ca25911e60d75e441ce0fe82e49f0dbf02c81a3161d1300",
"sha256:6427e36e38734cc5f8172a32837f1a7089fb3e3ae8b5c12f6882cb6466d6b482",
"sha256:1a4bac3ca47c45b2341b866d4403690c45c4a87e8cb897afda5dd6be52f37eda",
"sha256:7c06655789f2bd431a94e2cf7d363afbe3497ba18ca4565dc772ba82ade0cb74",
"sha256:411bb8845b78ec534f51535976d2a0c055c892e04d7f4fa67924c3a00a291f9e",
"sha256:902a5f810181e3b8b2f7c5e39013d1e4acceb917f1f778ac199d495abba1e9f3",
"sha256:52d9c23a9a201b21e95fed351c1ba1418a54ba1bd2ba26f5238d8bd8f38fd328",
"sha256:9ffac285cc4fa861d7843807b42d509e216a8a107f694c4ac68f2a2d670332c7",
"sha256:5ba1eb4d2ba5041fcc90b141f7942ff4e59570dddc8dc1786f2fe32d7d19c41d",
"sha256:9ba725af2ff003dfa3fa052c2a9d8580f46b78bb603986d3428037c328811a3f",
"sha256:d5455ab92c3f4a8a72d62f8ae5557440a8e5d09c6580e45f0f8f2747bb79c07d",
"sha256:7c77abddd30092838eb397a4c64e73ee743eca8bf2412c9914e8ad2e6191bed9"
]
},
7.容器数据卷
Docker 容器数据卷是用于在容器和宿主机之间共享持久化数据的机制。这个概念最初在 Docker 0.7 版本中引入。
数据卷的主要作用是允许容器之间或容器与宿主机之间共享数据,并且这些数据可以在容器被销毁后仍然保留。数据卷可以用于存储应用程序的配置、日志、数据库文件等等。使用数据卷的优势包括数据的持久化、容器之间的数据共享、以及方便地对数据进行备份和恢复。
在 Docker 中,数据卷可以通过以下几种方式创建:
-
使用
-v
参数:可以在docker run
命令中使用-v
参数来创建数据卷,并将宿主机上的目录或文件挂载到容器内部的指定路径上。例如:docker run -v /host/path:/container/path ...
-
使用
--mount
参数:从 Docker 1.13 版本开始,推荐使用--mount
参数来创建数据卷。这个参数提供了更加灵活的选项,可以指定数据卷的类型、读写权限等。例如:docker run --mount type=bind,source=/host/path,target=/container/path ...
-
Dockerfile 中声明:在 Dockerfile 中使用
VOLUME
命令来声明数据卷。这样在容器运行时,Docker 将自动创建对应的数据卷。例如:FROM image:tag VOLUME /container/path
无论采用哪种方式,一旦数据卷被创建,容器内的数据变动将会直接反映到宿主机上,并且即使容器被删除,数据卷中的数据也会保留下来,直到手动删除数据卷为止。
# 将本机/home/ceshi 挂在至容器内的/root下
docker run -it -v /home/ceshi:/root centos /bin/bash
#在本机与容器中各自新建文件,会发现容器内外都同时生成该文件
touch test.go
#docker rm -f centos 删除容器后,外部文件仍然存在
1、匿名挂载与具名挂载
在 Docker 中,有两种主要的数据卷挂载方式:匿名挂载和具名挂载。
-
匿名挂载:
- 匿名挂载是通过
-v
或--volume
参数或者--mount
参数而不指定目标路径来创建的挂载。例如:docker run -v /host/path ...
。 - 在匿名挂载中,Docker 会自动生成一个随机的目录,并将它挂载到容器内指定的路径上。这样的挂载方式对用户来说是透明的,用户无需关心实际挂载的目录是什么。
- 匿名挂载对于临时存储数据或者不关心数据存储位置的场景非常有用。
- 匿名挂载是通过
-
具名挂载:
- 具名挂载是通过
-v
或--volume
参数或者--mount
参数来指定宿主机上的目录与容器内部的目录进行挂载的方式。例如:docker run -v /host/path:/container/path ...
。 - 具名挂载中,用户需要明确指定宿主机上的路径和容器内的路径,这样就可以将宿主机上的目录挂载到容器内部。这样的挂载方式更加灵活,可以控制数据的存储位置和访问权限。
- 具名挂载适用于需要持久化存储数据或者对数据存储位置有特定要求的场景。
- 具名挂载是通过
docker volume inspect 容器名称/id
2、数据卷容器
匿名挂载数据卷时,如果直接启动两个相同的容器,容器内的数据挂载是不互通的。即容器1挂载完成后。容器2挂载相同目录的数据卷。容器1中挂载的数据变化后。容器2无变化。
- 容器卷继承 --volumes-from
#在多个相同的容器中,如果想要共享数据,使用数据卷容器,将容器作为一个父数据卷
#其他容器来挂载到父卷下,就可以实现共享来
docker run -it --name docker02 --volumes-from docker01 my/centos
8.DockerFile
dockerfile是用来构Docker镜像的构建文件,是由一系列命令和参数构建的脚本文件。
构建步骤:
- 编写dockerfile文件
- Docker build 构建镜像
- docker run 运行容器
DOckerFile 指令
FROM # 是基于哪个镜像的基础镜像,当前新镜像
MAINTAINER # 镜像维护者的姓名混合邮箱地址
RUN # 容器构建时需要运行的命
EXPOSE # 当前容器对外保留出的端口
WORKDIR # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV # 用来在构建镜像过程中设置环境变量
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY # 类似ADD,拷贝文件和目录到镜像中!
VOLUME # 容器数据卷,用于数据保存和持久化工作
CMD # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效
ENTRYPOINT # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD # 当构建一个被继承的DockrFi1e时运行命令,父镜像在被子镜像继承后,父镜像ONBUILD被触发
DockerFile构建过程
基础知识:
1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数
2、指令按照从上到下,顺序执行
3、# 表示注释
4、每条指令都会创建一个新的镜像层,并对镜像进行提交
流程:
1、docker从基础镜像运行一个容器
2、执行一条指令并对容器做出修改
3、执行类似 docker commit 的操作提交一个新的镜像层
4、Docker再基于刚提交的镜像运行一个新容器
5、执行dockerfile中的下一条指令,直到所有指令执行完成
9.简单的实践示例,发行自己版本的centos
Docker Hub 中99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的
Scratch镜像很赞,它简洁、小巧而且快速,它没有bug、安全漏洞、延缓的代码或技术债务。除了被Docker添加了metadata之外,它
基本上是空的。
我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工
作量,但付出的代价是需要下载很大的镜像包。
如果我们的需求是 在构建一个符合我们实际业务需求的Docker镜像的前提下,确保镜像尺寸尽可能的小,应该怎么做呢?
思路是使用空镜像scratch,可以说是真正的从零干始构建属于自己的镜像
创建dockerfile文件
FROM centos
# 作者信息
MAINTAINER MYNAME<MYEMAIL@email.com>
#设置一个路径变量
ENV MYPATH /usr/local
#工作地址
WORKDIR $MYPATH
#在基础的centos上,添加自己的一些工具
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---------end-------"
CMD /bin/bash
构建镜像
最后一个.代表全部执行
docker build -f dockerfile-mycentos -t mycentos:1.0 .
报错centos8中镜像仓库中appstream不存在。替换仓库源,成功构建镜像
FROM centos
# 作者信息
MAINTAINER MYNAME<MYEMAIL@email.com>
#设置一个路径变量
ENV MYPATH /usr/local
#工作地址
WORKDIR $MYPATH
#解决centos8的问题,替换镜像源
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y
#在基础的centos上,添加自己的一些工具
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "---------end-------"
CMD /bin/bash
docker history 可以查看镜像的变更历史
镜像发布
公用仓库 dockerhub https://hub.docker.com/
docekr login -u 用户名 -p 密码
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
#登录成功
#上传镜像需要打标签
docker tag 8732db9fe584 bukel/mycentos:1.0
docker push bukel/mycentos:1.0
#结束后,向全世界共享了你的镜像
镜像本地打包与加载
docker save
docker load