文章目录
Docker
方便之处:有提供镜像,一键部署,像虚拟机一样的环境、文件隔离,当我需要改动server的个人目录之外内容时,就显得尤为需要了这种隔离性了,目前不会给我带来明显收益。
常用操作,
容器
列出运行容器
docker ps
进入容器
docker exec -it xxx bash
停止容器
docker stop xxx
创建容器(在镜像那边介绍,需要镜像)
删除容器
docker rm xxx
查看容器日志
docker logs xxx
列出全部容器
docker ps -a
镜像
查看镜像
docker image ls
查看的是本地Docker主机上的镜像列表
用镜像创建容器
假设你想要在 Docker 中运行一个 Nginx 容器,并且希望将容器的 80 端口映射到宿主机的 8080 端口上。同时,你想要给这个容器起一个名字,比如叫做 my-nginx
。你可以使用以下命令:
docker run -d -p 8080:80 --name my-nginx nginx
让我们分解这个命令:
docker run
:Docker 运行命令,用于创建并启动一个新的容器。-d
:表示以“detached”模式运行容器,即在后台运行。-p 8080:80
:表示端口映射。将容器内部的 80 端口映射到宿主机的 8080 端口。格式为<宿主机端口>:<容器端口>
。--name my-nginx
:为容器指定一个名称,这里是my-nginx
。nginx
:指定要运行的 Docker 镜像的名称。在这个例子中,我们使用的是官方的 Nginx 镜像。
执行完这个命令后,Docker 会从 Docker Hub 下载 nginx
镜像(如果本地没有的话),然后创建并启动一个名为 my-nginx
的容器。容器的 80 端口会映射到宿主机的 8080 端口。
那如果我没有想要明确指定的镜像,默认可以选择哪些镜像来创建容器?
- ubuntu:一个流行的 Linux 发行版,通常用作基础环境。
- debian:另一个广泛使用的 Linux 发行版。
- alpine:一个非常小的 Linux 发行版,适合用作容器的基础镜像,因为它体积小,启动快。
- nginx:一个高性能的 HTTP 服务器和反向代理。
- redis:一个开源的内存数据结构存储系统,用作数据库、缓存和消息中间件。
- mongo:MongoDB 是一个基于文档的分布式数据库。
- mysql:一个广泛使用的开源关系数据库管理系统。
- python:Python 是一种高级编程语言,其官方镜像提供了一个 Python 运行环境。
- node:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
- java:Java 是一种广泛使用的编程语言,用于企业级应用开发。
使用这些官方镜像的好处是它们都是预先配置好的,可以直接用来创建容器并运行相应的服务。例如,如果你想要创建一个运行 Python 应用的容器,你可以选择 python
镜像。
创建容器时,如果没有指定镜像,Docker 会尝试寻找一个合适的默认镜像,或者提示你指定一个镜像。如果你没有特别的需求,可以使用这些官方镜像作为起点。例如,要使用官方的 Nginx 镜像创建并运行一个容器,可以使用以下命令:
docker run -d -p 8080:80 --name my-nginx nginx
这个命令会从 Docker Hub 下载 nginx
镜像(如果本地没有的话),并将容器的 80 端口映射到宿主机的 8080 端口,然后启动容器。
请注意,选择哪个镜像取决于你想要在容器中运行什么应用或服务。如果你有特定的需求,应该寻找或创建一个包含所需环境和依赖的镜像。
运行本地 Docker Registry(忽略,目前有)
如果你还没有运行一个本地 Docker Registry,你可以通过以下命令启动一个:
docker run -d -p 5000:5000 --name 容器名称 镜像名称:2
docker run
:Docker CLI 的命令,用于创建一个新的容器实例。-d
:表示以 detached 模式运行容器,即在后台运行,不会阻塞命令行。-p 5000:5000
:这个参数用于端口映射,格式为<宿主机端口>:<容器端口>
。在这里,它将宿主机的 5000 端口映射到容器内部的 5000 端口。这意味着,当你从宿主机或其他机器访问宿主机上的 Registry 服务时,你会使用宿主机的 5000 端口。--name 容器名称
:为新创建的容器指定一个名称,这里是容器名称
。你可以使用docker ps
命令通过这个名称来查看容器的状态。镜像名称
:这是 Docker Registry 服务的镜像名称。Docker 会从 Docker Hub 下载这个镜像(如果本地没有的话),然后基于这个镜像创建容器。镜像名称:2
:指定使用的 Docker Registry 镜像的标签(tag),这里是2
。Docker 镜像可以有多个标签,用于区分不同的版本。在这个例子中,我们使用的是标签2
,它可能代表了 Registry 的一个特定版本。
这将启动一个本地的 Docker Registry 服务,并将其映射到宿主机的 5000 端口。
用容器制作镜像
docker commit my-ubuntu-container myusername/my-ubuntu-nginx:v1
镜像推送或存放
可以直接存放在本地:
docker commit my-ubuntu-container myusername/my-ubuntu-nginx:v1
这就结束了,我感觉本地就完全够了,都没必要上仓库,我的项目的程度更不需要上云。
关于本地 Docker 主机或本地 Docker Registry 服务区别?
Docker 镜像在本地可以存储在两种地方:本地 Docker 主机或本地 Docker Registry 服务。了解它们之间的区别很重要:
本地 Docker 主机上的镜像
- 存储位置:这些镜像存储在 Docker 主机的本地文件系统中,通常位于
/var/lib/docker
目录下。 - 访问方式:它们可以通过 Docker 主机上的 Docker 守护进程直接访问和管理,无需网络连接。
- 用途:本地镜像用于快速部署容器,因为它们不需要从远程位置下载。
- 共享和分发:本地镜像不能直接通过网络共享或分发。如果需要在多台主机间共享,必须先将镜像推送到一个 Docker Registry,然后其他主机从 Registry 拉取。
- 版本控制:本地镜像可以很容易地通过
docker save
和docker load
命令进行备份和恢复。
本地 Docker Registry 服务中的镜像
- 存储位置:这些镜像存储在运行 Docker Registry 服务的服务器上,可能是 Docker 主机本身或网络中的另一台机器。
- 访问方式:需要通过网络连接访问。Docker 主机通过 Registry 服务的 API 与 Registry 交互,进行镜像的拉取和推送。
- 用途:Registry 用于镜像的集中存储和分发,尤其适合于在多台 Docker 主机间共享镜像。
- 共享和分发:Registry 使镜像的共享和分发变得容易。团队成员可以拉取所需的镜像,或将新镜像推送到 Registry 中。
- 版本控制:Registry 通常提供版本控制功能,允许用户为镜像指定不同的标签(tags),方便管理和部署不同版本的镜像。
- 安全性:本地 Registry 可以配置认证和加密传输,增加安全性。
- 私有镜像:Registry 允许存储私有镜像,这些镜像不会公开到公共仓库,适合包含敏感信息或专有应用的场景。
可以推送到本地仓库(Local Docker Registry):
在推送镜像到本地仓库之前,你需要给你想要推送的镜像打上标签,指向你的本地仓库地址。例如,如果你想要推送 Ubuntu 镜像到本地仓库,你可以这样标记:
docker tag ubuntu:latest localhost:5000/ubuntu:latest
docker tag
:Docker CLI 的命令,用于给镜像设置一个新的标签。ubuntu:latest
:这是要标记的原始镜像的名称和标签。在这个例子中,ubuntu
是镜像的仓库名,而latest
是该仓库下的一个标签,通常表示最新版本的镜像。localhost:5000/ubuntu:latest
:这是新标签的完整名称,包括了镜像仓库的地址、仓库名、以及新的标签。在这个例子中:localhost:5000
:指定了本地 Docker Registry 服务的地址和端口。这里假设 Registry 服务运行在本地宿主机的 5000 端口上。ubuntu
:这是新标签中使用的仓库名,它与原始镜像的仓库名保持一致,但可以根据你的本地仓库结构进行更改。latest
:这是新标签中使用的标签名,它与原始镜像的标签保持一致。你也可以选择使用不同的标签名,如v1
、stable
等,以区分不同的镜像版本。
推送到本地仓库
docker push localhost:5000/ubuntu:latest
可以推送到远程仓库(Docker Registry):
关于远程仓库
在使用 docker push 镜像名
命令时,通常需要指定一个远程仓库(repository),这是用来存放你的 Docker 镜像的远程服务器。远程仓库可以是 Docker Hub,也可以是任何其他兼容 Docker 的容器镜像仓库,比如 Google Container Registry、Amazon Elastic Container Registry (ECR)、Harbor、JFrog Artifactory 等。
当你使用 docker push
命令推送镜像时,如果没有指定仓库的完整路径,Docker 默认会将其推送到 Docker Hub 上的仓库。仓库的完整路径格式通常是 仓库名/镜像名:标签
。
例如,如果你想要推送一个名为 my-ubuntu
的镜像到 Docker Hub 上的 myusername
仓库,并使用 latest
作为标签,你应该运行:
docker push myusername/my-ubuntu:latest
在这个命令中:
docker push
是 Docker CLI 的命令,用于将本地镜像推送到远程仓库。myusername/my-ubuntu:latest
是要推送的镜像的完整仓库路径。其中myusername
是 Docker Hub 上的用户名,my-ubuntu
是镜像名,latest
是标签。
如果你没有特别指定仓库名和标签,Docker 默认会使用当前目录下 Dockerfile
中的 FROM
指定的基础镜像名,以及默认的 latest
标签。
在推送镜像之前,你需要确保已经通过 docker login
命令登录到了远程仓库,否则 Docker 无法将镜像推送到远程服务器。
docker操作
几乎不用,会影响所有正在run
的容器。
启动docker
sudo systemctl start docker
拷贝文件
例如,从当前目录拷贝一个文件到名为 my_container 的容器内
docker cp /path/on/host my_container:/path/in/container