安装卸载使用教程 🔗 常用官方网址
🛠 安装卸载 默认使用docker-ce
版本,即社区版
下载 各系统下载教程都可以看官方文档下载说明页 进行查询。
win/mac:在Docker下载页 选择系统版本下载可视化软件(一般会自动识别系统),
Linux:使用命令下载。
debian:10.10 buster
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sudo apt-get remove docker docker-engine docker.io containerd runc sudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
centos:7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 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 sed -i "" "s+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+g" /etc/yum.repos.d/docker-ce.repo
安装 debian:10.10 buster
1 2 3 4 5 6 7 8 9 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker version
centos:7
1 2 3 4 5 6 7 8 sudo yum install docker-ce docker-ce-cli containerd.io sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker version
启动 1 2 sudo systemctl start docker
卸载 debian:10.10 buster
1 2 3 4 5 sudo apt-get purge docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
centos:7
1 2 3 4 5 sudo yum remove docker-ce docker-ce-cli containerd.io sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd
国内镜像加速 📝jordy的个人账号🔗镜像加速地址
1 2 3 4 5 6 7 8 9 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : ["https://7huwknxy.mirror.aliyuncs.com" ]} EOF sudo systemctl daemon-reload sudo systemctl restart docker
MacOs
在任务栏点击 Docker Desktop 应用图标 -> Perferences
在左侧导航菜单选择 Docker Engine,在右侧输入栏编辑 json 文件。
将加速地址添加到“registry-mirrors”的数组里
点击 Apply & Restart按钮,等待Docker重启并应用配置的镜像加速器。
📝 常用命令 帮助命令 1 2 3 4 docker version docker info docker --help docker 命令 --help
镜像命令
解释
REPOSITORY 镜像的仓库源
TAG 镜像标签
IMAGE ID 镜像ID
CREATED 镜像创建时间
SIZE 镜像大小
1 2 3 -f docker search python -f=STARS=1000
1 2 docker pull python docker pull python:3.10.0-slim
1 2 3 4 docker rmi -f {镜像ID} docker rmi -f {镜像ID} {镜像ID} {镜像ID} docker rmi -f $(docker images -aq)
查看镜像的Dockerfile操作记录 docker history {镜像ID}
容器命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 docker run [可选参数] {镜像} --name "RongName" -d -it -p -p 127.0.0.1:8080:8080 -p 8080:8080 -p 8080 -P docker run -it --rm python:3.10.0
1 2 3 4 5 docker rm {容器ID} -f docker rm -f $(docker ps -aq) docker ps -a -q|xargs docker rm
1 2 3 4 5 docker start {容器ID} docker restart {容器ID} docker stop {容器ID} docker kill {容器ID} docker stats {容器ID}
其它常用命令
后台启动命令 docker run -d centos
常见的坑:centos,nginx等 执行后台启动后,使用 docker ps查看容器运行,发现centos停止了。
说明:容器使用后台运行,需要一个前台进程,docker发现没有应用/没有提供服务,就会自动停止。 > 就是容器需要里面有操作,例如打印日志等等。
1 2 3 4 docker logs -f -t --tail 10 {容器ID} docker run -d centos:7 /bin/sh -c "while true;do echo \"wtf????\";sleep 1;done"
查看容器内的进程信息 docker top {容器ID}
查看镜像元数据 docker inspect {镜像ID}
进入当前正在运行的命令
通常容器都是后台运行的,会需要进入容器进行操作。
1 2 docker exec -it {容器ID} /bin/bash docker attach {容器ID}
1 2 3 docker cp {容器ID}:/home/test.conf /home
命令小结 常用命令图解
🚮 安装一些服务 nginx 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 docker pull nginx:1.20-alpine docker images docker run -d -p 2333:80 \ --name ng1 \ --net netjordy \ -v /home/jordy/etc/volume/ng1:/etc/nginx:rw \ -v /home/jordy/log/volume/ng1:/var/log/nginx:rw \ --ip 172.20.0.2 \ nginx:1.20-alpine docker exec -it ng1 /bin/bash
查看[[Nginx#Nginx配置文件|Nginx配置文件]]修改方式
💿 镜像操作 Commit镜像 原始镜像运行后的容器里的其它操作,如果不想每次都修改,需要更新为新的镜像,则需要用提交命令打包为新镜像。
1 docker commit -m="提交的描述信息" -a="作者" {容器ID} {镜像名}:{tag}
💾 容器卷操作 卷挂载
问题:容器运行产生的数据或运行配置,删除容器后,数据就会丢失,如何保持数据持久存在,配置可在容器外随时修改?
可使用容器卷技术,即将容器内的目录,挂载到宿主机上,这样目录就会双向绑定,任何一边的修改,另一边都会生效。 > 同时,也可以解决不同容器相互隔离的问题,不同的容器也可以共享数据。 > ⚠️只有修改数据会同步,若关闭容器/删除容器,挂载到宿主机的数据不会丢失。
容器卷挂载命令 -v 宿主机目录:容器内目录
,类似端口映射命令,将容器目录映射到宿主机。
1 2 3 4 5 6 7 8 docker run -d -P --name nginx001 -v /home/tsts/nginx:/etc/nginx nginx docker inspect {容器ID} docker volume ls
具名/匿名挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 -v 容器内路径 -v 自定义卷名:容器内路径 -v 宿主机路径:容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx docker run -d -P --name nginx02 -v juming_nginx:/etc/nginx nginx docker vlume inspect juming_nginx
⚠️:例如nginx挂载的时候,如果指定宿主机目录,宿主机的文件与容器目录文件不一致,nginx容器会启动失败, 所以挂载前,最好找一个通用的nginx配置目录文件放在宿主机目录内
容器数据共享 容器01 挂载了1个目录volume01 ,其它容器如果想共享容器01 挂载的目录,启动时使用--volumes-from{共享容器}
继承容器01 的目录,大家都可以使用这个共享目录,此时容器01 就是一个数据卷容器。
数据卷容器,停止或者运行,都可以被继承。如果被删除了,则不可以被继承。
1 2 3 docker run -it --name dk01 -v /home/volume01 centos:7.9.2009 docker run -it --name dk02 --volumes-from dk01 centos:7.9.2009 docker run -it --name dk03 --volumes-from dk01 centos:7.9.2009
应用场景:容器之间可以进行配置信息的传递,当配置多个容器,不需要重复配置,只需要继承.
扩展 挂载目录的权限 :通过 -v [路径配置]:ro 或 :rw 可以改变挂载目录的读写权限
1 2 3 4 5 6 ro readonly rw readwrite docker run -d -P --name nginx03 -v juming_nginx03:/etc/nginx:ro nginx docker run -d -P --name nginx03 -v juming_nginx03:/etc/nginx:rw nginx
小结 不论是具名/匿名,所有容器内的卷,若没有指定宿主机目录,一般都是在/var/lib/docker/volumes/{具名、容器sha256}/_data
下。
所以通过具名挂载,可以方便在volumes目录下查找自己的挂载容器目录。
📖 Dockerfile 介绍用例 Dockerfile是用来构建docker镜像的构建文件,是一个命令脚本。 文件内的每一条命令,就是每一层镜像。
基础知识
每个保留关键字(指令)都必须是大写字母
执行顺序从上到下
==#==表示注释
每一个指令都会创建提交一个新的镜像层
文件名最好用Dockerfile
使用Dockerfile构建镜像
1 2 docker build -f /Users/jordydrins/JCode/DockerJordy/tsts/Dockerfile -t jordy-centos:1 .
构建过程
构建Dockerfile文件,编写源码
通过构建的文件生成镜像,打包发布
运行镜像,创建容器提供服务
指令 ⚠️ Docker Hub中,99%的镜像都是从基础镜像进行构建的:FROM scratch
指令
注释
FROM
基础镜像,一切从这里开始构建
MAINTAINERLABEL
镜像时谁写的,指定维护者信息,一般写姓名,邮箱等。——命令已弃用作用同上,新写法使用key=value key=value
RUN
镜像构建的时候需要运行的命令
ADD
添加压缩包,例如需要安装nginx,需要导入压缩包运行,后面带路径会自动解压
WORKDIR
镜像的工作目录
VOLUME
挂载的目录,只能匿名挂载:VOLUME [“volume1”,“volume2”]
EXPOSE
指定对外暴露的端口,运行时就不需要写 -p命令
CMD
指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被docker run 附带的命令替换
ENTRYPOINT
指定这个容器启动的时候要运行的命令,docker run附带的命令会追加在后面执行
ONBUILD
当构建一个被继承Dockerfile,此时会运行该指令。是一个触发指令
COPY
类似ADD命令,将文件拷贝到镜像中
ENV
构建的时候设置环境变量
构建用例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 FROM centos:7.9 .2009 LABEL uname ="jordy" mail="upfront_saloon0a@icloud.com" version="1.0" ENV MYPATH /usr/localWORKDIR $MYPATH RUN yum -y install epel-release RUN yum -y install nginx EXPOSE 80 CMD echo $MYPATH CMD echo "------>jordy dockerfile end<------" CMD /bin/bash
📡 Docker网络 Docker网络概述 使用 docker network ls
可以查看docker的所有网络列表,使用docker network inspect {netNAME}
可以查看网络名的具体配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 🐱 jordy🗂 ~ :docker network ls NETWORK ID NAME DRIVER SCOPE f47fb2873554 bridge bridge local 1997eb7b6c54 host host local e3abf1a768e1 none null local 🐱 jordy🗂 ~ :docker network inspect bridge [ { "Name" : "bridge" , "Id" : "f47fb2873554fdf12029f366a30d001514d58b6fbb7a200bb6dff88437cbeb75" , "Created" : "2021-11-29T19:42:47.601325084+08:00" , "Scope" : "local" , "Driver" : "bridge" , "EnableIPv6" : false , "IPAM" : { "Driver" : "default" , "Options" : null, "Config" : [ { "Subnet" : "172.17.0.0/16" , "Gateway" : "172.17.0.1" } ] }, "Internal" : false , "Attachable" : false , "Ingress" : false , "ConfigFrom" : { "Network" : "" }, "ConfigOnly" : false , "Containers" : {}, "Options" : { "com.docker.network.bridge.default_bridge" : "true" , "com.docker.network.bridge.enable_icc" : "true" , "com.docker.network.bridge.enable_ip_masquerade" : "true" , "com.docker.network.bridge.host_binding_ipv4" : "0.0.0.0" , "com.docker.network.bridge.name" : "docker0" , "com.docker.network.driver.mtu" : "1500" }, "Labels" : {} } ]
网络模式
bridge:桥接docker(默认, 自己创建的也可以使用bridge模式)
null:不配置网络
host:和宿主机共享网络
container:容器网络连通(用得少,局限性很大!)
启动示例 正常启动Docker的时候,默认是bridge(注意这个是docker0的NAME),使用bridge模式。 若想指定启动的网络配置,则需要使用--net命令
指定需要启动的网络NAME。
1 2 3 4 5 docker run -d -P --name ng1 --net bridge nginx:1.20-alpine docker run -d -P --name ng1 nginx:1.20-alpine
Docker0 Docker安装后会创建一个默认网卡 Docker0 ,默认ip172.17.0.1 。相当于路由网关,可给容器分配内网ip,并使用网桥连接各个容器。
Dockero0的默认ip可以更改,编辑/etc/docker/daemon.json
文件,添加{"bip":"192.168.0.1/16"}
,value自行配置网段,避免与宿主机同网段,重启Docker服务即可。
Docker0示例 每启动一个容器,Docker0 就会创建一个新的网卡,宿主机与容器双向绑定,也就是每一个容器创建的网卡都是一对一对的,这里面使用到的就是==evth-pair==网桥技术,充当一个桥梁,链接各种虚拟网络设备。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ~:ip addr 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link /ether 02:42:bd:6c:68:c3 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:bdff:fe6c:68c3/64 scope link valid_lft forever preferred_lft forever 237: veth9efcd88@if236: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link /ether 82:a8:a5:a5:8a:53 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::80a8:a5ff:fea5:8a53/64 scope link valid_lft forever preferred_lft forever 239: veth4e9db6c@if238: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link /ether 16:97:1b:53:f7:a1 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::1497:1bff:fe53:f7a1/64 scope link valid_lft forever preferred_lft forever ~:docker exec -it 4b69baf5be49 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link /loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 238: eth0@if239: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link /ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever ~:docker exec -it b2e57bbb3695 ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link /loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 236: eth0@if237: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP link /ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever
Docker0连接特性
Docker0作为类似路由器网关的作用,链接各个容器,使各容器、Docker0之间可相互ping通,但不同的容器之间不是直接ping通,而是:容器1 – Docker0 – 容器2
docker0之间不能使用容器名称ping通,必须使用ip。
容器启动可指定内网ip,若不指定容器启动ip,Docker0会默认自动分配内网ip。
容器删除/容器停止,都会删除掉网桥对。
link 若想2个容器之间不通过Docker0网桥,想直接连接2个容器,--link
可以在启动容器的时候,指定链接的另一个容器。
docker run -it --name ng2 --link ng1 nginx:1.20-alpine ping ng1
需要注意的是,只能正向ping通,也就是连接方ng2 ping被连接方ng1 。若想双向ping,则需要双向link。link成功后,可以在容器的/etc/hosts
文件中查看到绑定的dns解析。
小结
-link
配置就是host的dns解析,真实配置不推荐使用。
同时也不推荐使用Docker0 ,它问题是不支持容器名的连接访问。
推荐==自定义网络==。
自定义网络 自定义网络可以ping容器名称,也不需要相互link,相当于docker0+link的完全版。
对于redis、mysql等集群来说,不同的集群使用各自的自定义网络,双方的内网相互不影响,保证集群的安全和健康。
自定义网络命令 :
–driver bridge: 指定模式
–subnet 172.18.0.0/16: 指定IP段
–gateway 172.18.0.1: 指定默认网关
docker network create --driver bridge --subnet 172.18.0.0/16 --gateway 172.18.0.1 {mynetname}
网络连通 假如配置了2个网络,网络A ,网络B ,此时2个网络互相不影响,各自的容器只能在网络内部互相访问。
如果需要不同网络的容器可以连通,不能直接将2个网络进行网卡打通,会影响网络。
此时需要需要使用connect
命令,将网络A 的容器1,启动时,配置到网络B 中。
docker network connect {netNAME} {容器名}
通过查看网络的配置可以发现,网络B 直接给网络A 的容器1,创建了一个B里面的ip,也就是说,这个容器同时拥有了2个ip
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 🐱 jordy🗂 ~ :docker network connect mynetname ng1 🐱 jordy🗂 ~ :docker network inspect mynetname [ { "Name" : "mynetname" , "Id" : "cac6e143e63a11904a771349444e1e45139c39c12b44b2f5a4aab5379576201a" , "Created" : "2021-12-01T12:24:22.299293052+08:00" , "Scope" : "local" , "Driver" : "bridge" , "EnableIPv6" : false , "IPAM" : { "Driver" : "default" , "Options" : {}, "Config" : [ { "Subnet" : "172.18.0.0/16" , "Gateway" : "172.18.0.1" } ] }, "Internal" : false , "Attachable" : false , "Ingress" : false , "ConfigFrom" : { "Network" : "" }, "ConfigOnly" : false , "Containers" : { "7218dcde91909f7a18c5e6904a7dffc6cf86caa102909208b75b7a9ea6066084" : { "Name" : "ng1" , "EndpointID" : "7c2e5afb748129c6d135ab9d1d2049513b4cf37b46feee0d8287b5d98ba5d646" , "MacAddress" : "02:42:ac:12:00:03" , "IPv4Address" : "172.18.0.3/16" , "IPv6Address" : "" }, "7232a077946709c3c1cec200a9179fc6157ef740cda31cdc3bf600d87acc9f14" : { "Name" : "ng-net1" , "EndpointID" : "114f540140de449c32bfda80ba95e9a40ca327ec094176489aed62c23aab17b3" , "MacAddress" : "02:42:ac:12:00:02" , "IPv4Address" : "172.18.0.2/16" , "IPv6Address" : "" } }, "Options" : {}, "Labels" : {} } ]
📦 部署Redis集群 📎 附件 命令注释 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 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(s) 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 Management Commands: app* Docker App (Docker Inc., v0.9.1-beta3) builder Manage builds buildx* Build with BuildKit (Docker Inc., v0.6.3-docker) config Manage Docker configs container Manage containers context Manage contexts image Manage images manifest Manage Docker image manifests and manifest lists network Manage networks node Manage Swarm nodes plugin Manage plugins scan* Docker Scan (Docker Inc., v0.9.0) secret Manage Docker secrets service Manage services stack Manage Docker stacks swarm Manage Swarm system Manage Docker trust Manage trust on Docker images volume Manage volumes Commands: attach Attach local standard input, output, and error streams to a running container build 用 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 diff Inspect changes to files or directories on a container' s filesystemevents Get real time events from the server exec 在正在运行的容器中执行命令export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information 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 login Log in to a Docker registry logout Log out from a 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 push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats 实时显示容器的资源使用情况 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 wait Block until one or more containers stop, then print their exit codes