docker基本命令以及私有仓库创建
docker基本命令使用和私有仓库创建
本文介绍docker的基本功能和使用方式。并提供官方私有仓库的使用操作方法。
docker基础架构介绍
docker存在4个主要部分。
分别是:镜像、容器、数据卷、网络
-
镜像
镜像是通过dockerfile或者从官方仓库(hub.docker)和国内镜像源(如阿里云)进行拉取下来的。这也是我们运行容器的基础环境。
(比如说,我们要运行centos的环境就拉centos的镜像。要运行python3的环境,就拉python3的镜像)remarks:镜像类似于容器的类。基于镜像可以创建完全相同的容器
-
容器
容器是基于镜像创建的不同的每个个体。通过参数可以约定它的启动情况。并给予文件和相关运行配置。使得每个个体各司其职。
remarks:实际上每个容器(或者说它们的父亲镜像)都是一个最小化的linux系统。
-
数据卷
理解数据卷之前,得先解释一下挂载。
挂载:
- why:我们运行容器之后,如果要在容器内运行自己的代码,那么就得把文件传输进去。然而我们的宿主机不是直接与容器进行通信。所以就需采取挂载的方式。
- what:实际上,挂载就是将本机(也就是宿主机)的文件与容器的某个文件目录进行双向绑定。
在进行挂载之后。无论是改变宿主机还是容器中被挂载的文件。双方都会同时改变。
数据卷:
创建数据卷实际上就是在宿主机上创建一个特定目录。然后把容器内的文件绑定在这个特定目录上。
这个特定的文件可以用于备份。或者其他容器可以通过此卷再进行挂载。达到容器间某文件的一致性
remarks:实际上,在我们未指定卷的情况下。每个容器存在自己的文件系统。而这个文件系统也会通过匿名卷的方式保存在卷目录下
其中那个特定姓名的是我们自己创建的卷,而其他的都是容器运行创建的匿名卷。 -
网络
网络分为两种。一个是通过网络让容器与宿主机通信。另一个是通过容器间网络实现容器间互联
- 容器-宿主机 :容器与宿主机一般不直接通信,而是采取端口暴露的方式。比如说容器8000端口暴露到宿主机8888端口(用参数就是 -p 8888:8000)。这样的话,在我们访问8888端口时。就可以访问到容器的8000端口的服务。
- 容器1-容器2-容器n:容器之间的通信就不是使用端口暴露(也叫端口映射)的方式实现,而是采取docker网络的形式。当docker建立network的固定网络之后。带着网络启动之后。容器之间,就可以通过容器名(即容器1:> ping 容器2名)的方式ping通。同样服务之间也可以这样相连接。
remarks: docker提供了多种软件直接互联的网络方式。主要有以下几种网络种类:Bridge Network(桥接网络)、Host Network(主机网络)、Overlay Network(覆盖网络)
docker基本命令
对于已经比较了解的人,可以记下以下几点技巧:
- 输入容器或者镜像名时,可以输入它的前三个id值,就可以执行操作。
- sava和load命令可以打包镜像文件,commit命令可以将容器提交为镜像
- 以
--rm
启动镜像,在容器停止的时候会自动销毁 - 一个命令停止/删除所有容器
docker stop/rm `docker ps -aq`
- 在输入ps或者images指令之后,接下来输入容器名的时候可以使用tab补全。
镜像
这里展示镜像的基本操作
# 镜像的查看
docker images;
docker image ps;
# 镜像拉取
docker pull 镜像名:(镜像版本) # 版本不加默认拉latest
# 镜像创建(必须得有Dockerfile脚本文件,名字不能错。)(这里不做Dockerfile脚本书写的讲解)
docker build 带脚本的文件夹位置
# 镜像改tag
docker tag 旧镜像id/名字 新名字
# 镜像删除
docker rmi 镜像名
拉取/操作镜像
构建镜像
容器
# 通过镜像创建容器并运行
docker run --name 指定名字 镜像
# 重要参数(注意仓鼠只能写在run后面,不能放最后)
-d 后台运行 -P 随机端口映射运行 -p xxxx:xxxx 指定端口映射运行
-i 则让容器的标准输入保持打开 -t 让Docker分配一个伪终端,并绑定到容器的标准输入上(it一般一起使用进入交互式终端)
--rm 容器停止后自动移除 --name 设置容器名
# 例如:docker run -it centos /bin/bash
# 查找容器
docker ps # 查找正在运行的容器
docker ps -a # 查找所有运行过的容器,包括挂掉的
# -q参数,只显示容器id
# 查看容器日志
docker logs 容器名/容器id(前三位即可)
docker logs 容器名/容器id -f # 挂起容器输入日志
# 进入容器
docker exec -it 容器名/容器id /bin/bash
# 操作容器
docker stop/start/restart 容器名/容器id # 停止、启动、重启容器
docker rm 容器名/容器id # 删除容器
docker rm `docker ps -aq` # 删除所有容器
数据卷
# 创建一个卷
docker volume create test-vol
# 查看所有数据卷
docker volume ls
# 查看指定卷信息
docker volume inspect test-vol
# -v或者--mount通过挂载方式启动容器
docker run -d --name=test-nginx -p 8011:80 -v test-vol:/usr/share/nginx/html nginx:1.13.12
docker run -d -it --name=test-nginx -p 8011:80 --mount source=test-vol,target=/usr/share/nginx/html nginx:1.13.12
# 都是挂载命令,使用 -v 挂载时,如果宿主机上没有指定文件不会报错,会自动创建指定文件;当使用 --mount时,如果宿主机中没有这个文件会报错找不到指定文件,不会自动创建指定文件。
# 删除卷
docker volume rm test-vol # 单删除卷
docker rm -v 容器名/容器id # 删除容器时绑定删除卷
docker volume prune # 删除所有没使用的卷
注意:
上方挂载数据卷的方式同样也适用于挂载本地文件。数据卷可以看见一个本地文件路径的别名。(数据卷的位置一般在/var/lib/docker/volumes)
网络
# -P/-p 端口映射启动
docker run -d -P nginx:alpine
# 查看端口的绑定情况
docker port 容器名/容器id 端口号
# 注意-p可以重复使用
docker run -d \
-p 80:80 \
-p 443:443 \
nginx:alpine
# 创建桥接网络(还有主机网络、覆盖网络……,参考文档https://docs.docker.com/engine/network/drivers/)
docker network create -d bridge my-net # -d是用来指定网络类型
# 容器连接网络启动
docker run -it --rm --name busybox1 --network my-net busybox sh
docker run -it --rm --name busybox2 --network my-net busybox sh
# 进入容器后执行ping的情况
# ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
# ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms
# 查看已创建的网络
docker network ls
# 查看指定网络的详细信息
docker network inspect my-net
# 将一个已运行的容器连接到一个网络
docker network connect my-net 容器名/容器id
# 从网络中断开一个容器
docker network disconnect my-net 容器名/容器id
# 删除自定义网络
docker network rm my-net
docker私有仓库部署
私有仓库配置
docker提供一个私有仓库镜像。只需要拉取它,就可以进行私有仓库的拉取和推送容器
这里直接展示示例
私有仓库服务器:124.71.140.159,配置如下
# 下载镜像
root@hcss-ecs-b72a:~# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
930bdd4d222e: Pull complete
a15309931e05: Pull complete
6263fb9c821f: Pull complete
86c1d3af3872: Pull complete
a37b1bf6a96f: Pull complete
Digest: sha256:12120425f07de11a1b899e418d4b0ea174c8d4d572d45bdb640f93bc7ca06a3d
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest
# 准备好私有仓库镜像和需要推送的镜像
root@hcss-ecs-b72a:~# docker images;
REPOSITORY TAG IMAGE ID CREATED SIZE
registry latest cfb4d9904335 11 months ago 25.4MB
hhh/hello latest d2c94e258dcb 16 months ago 13.3kB
# 镜像改名
docker tag hhh/hello 124.71.140.159:8888/hello
# 启动私有镜像库(挂载位置可自定,也可以使用数据卷)
docker run -d -p 8888:5000 -v /opt/data/registry:/var/lib/registry registry
# 推送镜像报错
root@hcss-ecs-b72a:~# docker push 124.71.140.159:8888/hello
Using default tag: latest
The push refers to repository [124.71.140.159:8888/hello]
Get "https://124.71.140.159:8888/v2/": http: server gave HTTP response to HTTPS client
# 修改/etc/docker/daemon.json配置文件
# 通过vim修改
vim /etc/docker/daemon.json
# 改成如下内容,注意这里"insecure-registries":["124.71.140.159:8888"]
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.jianmuhub.com",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://dockerhub1.beget.com",
"https://noohub.ru"],
"insecure-registries":["124.71.140.159:8888"]
}
# 读取配置重启
systemctl daemon-reload
systemctl restart docker
# 重新启动容器(会挂掉,或者直接启动一个新的)
docker run --privileged=true -d -p 8888:5000 -v /opt/data/registry:/var/lib/registry registry
# 再进行推送就ok了
root@hcss-ecs-b72a:~# docker push 124.71.140.159:8888/hello
Using default tag: latest
The push refers to repository [124.71.140.159:8888/hello]
ac28800ec8bb: Pushed
latest: digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7 size: 524
如此,在推送成功后,我们可以在这个api当中看到我们推送上去的仓库json:http://124.71.140.159:8888/v2/_catalog
接下来在我本地的虚拟机上执行拉取操作:
# 先配置需要配置的/etc/docker/daemon.json并重启
vim /etc/docker/daemon.json
# 改成如下内容,注意这里"insecure-registries":["124.71.140.159:8888"]
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.jianmuhub.com",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://dockerhub1.beget.com",
"https://noohub.ru"],
"insecure-registries":["124.71.140.159:8888"]
}
# 读取配置重启
systemctl daemon-reload
systemctl restart docker
# 执行拉取操作
root@long:/opt/test_docker# docker pull 124.71.140.159:8888/hello
Using default tag: latest
latest: Pulling from hello
c1ec31eb5944: Pull complete
Digest: sha256:d37ada95d47ad12224c205a938129df7a3e52345828b4fa27b03a98825d1e2e7
Status: Downloaded newer image for 124.71.140.159:8888/hello:latest
124.71.140.159:8888/hello:latest
# 这样就可以成功拉取和运行了
还有一种简单的镜像移植方式
还有通过sava-load指令的镜像移植方式。
# sava保存镜像
docker save 镜像名/镜像id > /opt/centos.tar.gz # 也可以指定其他文件
# scp给其他服务器发过去
scp /opt/centos.tar.gz root@124.71.140.159:/opt/
# load加载镜像
docker load < /opt/centos.tar.gz
如果想要制作私有镜像,还可以把修改的容器提交为镜像(commit命令):docker commit 059 chaoyu/centos-vim
docker报错汇总
-
进行私有仓库推送时:
Using default tag: latest
The push refers to repository [124.71.140.159:8888/hello]
Get "https://124.71.140.159:8888/v2/": http: server gave HTTP response to HTTPS client解决方式:
配置/etc/docker/daemon.json并重启docker# 先配置需要配置的/etc/docker/daemon.json并重启 vim /etc/docker/daemon.json # 改成如下内容,注意这里"insecure-registries":["124.71.140.159:8888"] { "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.jianmuhub.com", "https://huecker.io", "https://dockerhub.timeweb.cloud", "https://dockerhub1.beget.com", "https://noohub.ru"], "insecure-registries":["124.71.140.159:8888"] } # 读取配置重启 systemctl daemon-reload systemctl restart docker
-
容器内报网络错误
比如说我dockerfile下flask的时候报错:
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPConnection object at 0xffffb5bd3100>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution')': /pypi/simple/flask/
找不到问题,结果改容器的dns可以解决:
# 先配置需要配置的/etc/docker/daemon.json并重启 vim /etc/docker/daemon.json # 改成如下内容,注意这里 # "dns" : [ # "114.114.114.114", # "8.8.8.8" # ] { "registry-mirrors": ["https://docker.m.daocloud.io", "https://docker.jianmuhub.com", "https://huecker.io", "https://dockerhub.timeweb.cloud", "https://dockerhub1.beget.com", "https://noohub.ru"], "insecure-registries":["124.71.140.159:8888"], "dns" : [ "114.114.114.114", "8.8.8.8" ] } # 读取配置重启 systemctl daemon-reload systemctl restart docker
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!