docker基础原理不细讲了,这里记录一些日常学习及工作会用到的一些基础docker命令跟怎么安装docker和compose。
一、安装部署docker及compose
1、安装docker:
(1)卸载旧版本(如果安装过旧版本的话)
sudo yum remove docker docker-common docker-selinux docker-engine
(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
(3)、设置yum源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#1-4、可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
#1-5、安装docker
yum -y install docker-ce-19.03.5 docker-ce-cli-19.03.5 containerd.io
#1-6、启动并加入开机启动
sudo systemctl start docker
sudo systemctl enable docker
#1-7、验证安装是否成功(有Client和Server两部分表示docker安装启动都成功了)
docker version
Client: Docker Engine - Community
Version: 26.1.4
API version: 1.45
Go version: go1.21.11
Git commit: 5650f9b
Built: Wed Jun 5 11:32:04 2024
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 26.1.4
API version: 1.45 (minimum version 1.24)
Go version: go1.21.11
Git commit: de5c9cf
Built: Wed Jun 5 11:31:02 2024
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.33
GitCommit: d2d58213f83a351ca8f528a95fbd145f5654e957
runc:
Version: 1.1.12
GitCommit: v1.1.12-0-g51d5e94
docker-init:
Version: 0.19.0
GitCommit: de40ad0
#2-1、配置docker 镜像加速源并修改docker cgroup driver为systemd(驱动程序)
vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": [
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc",
"https://0tybptkz.mirror.aliyuncs.com"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "5"
},
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10,
"insecure-registries": ["192.168.xxx.xxx"]
}
#2-2、重新加载配置:
systemctl daemon-reload
#2-3、设置docker开启自启:
systemctl enable docker
#2-4、重启docker:
systemctl restart docker
#3-1、安装docker-compose
wget https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64
#赋予执行权
chmod +x docker-compose
#将compose文件移动至/usr/local/bin
mv docker-compose /usr/local/bin
#验证是否成功
[root@localhost ~]# docker-compose version
Docker Compose version v2.16.0
二、docker辅助类命令:
停止容器:docker stop 容器ID/容器名
重启容器:docker restart 容器ID/容器名
启动容器:docker start 容器ID/容器名
杀掉容器:docker kill 容器ID/容器名
三、镜像类命令
1、查看镜像:docker images
(1)选项:-a:列出所有镜像
(2)选项:-q:只显示镜像id
2、查找镜像:docker search 镜像名
3、拉取镜像:docker pull 镜像名:版本号
4、删除镜像:docker rmi 镜像id(docker rmi -f 镜像id:强制删除镜像)
5、查看镜像/容器/数据卷/构建缓存所占的空间:docker system df
6、镜像导入导出:
(1)镜像导出:docker save -o 包名.tar 镜像id
例:docker save -o nginx.tar 3b25b682ea82
(2)镜像导入:docker load -i 包名.tar
例:docker load -i nginx.tar(重新导入的镜像包名及版本号为none)
(3)添加标签(重命名):docker tag 镜像id 镜像名:版本号
例:docker tag 3b25b682ea82 nginx:latest
7、构建新镜像:
docker commit -m="提交信息" -a="作者信息" 容器名/容器ID 提交后的镜像名:Tag
例:docker commit -m="cs" -a="csm" d8498c13196b ubuntu:2024.10.31
四、容器类命令
1、运行容器:docker run -itd --name=”容器名” -p本地端口:容器端口 -v 本地目录:容器目录 镜像名:版本号
(1)选项:-i:交互式运行容器
(2)选项:-t:伪终端输入
(3)选项:-d:后台守护进程,不加-d退出容器后,容器关闭,加了之后退出容器后台运行
(4)选项:-v:挂在本地目录到容器,本地目录:容器目录
例:docker run -it -d -p8088:9696 --name="cs" -v /opt/ceshi/csm/:/opt/ceshi/csm ecebf0f33e0f
2、进入容器:docker exec -it 容器id bash
3、查看运行容器:docker ps
(1)选项:-a:罗列所有容器(包括历史容器)
(2)选项:-l:显示最近创建的容器
(3)选项:-n:显示最近n个创建的容器(docker ps -n 1)
4、复制容器内文件到本地:docker cp 容器:容器内路径 目的主机路径
例:docker cp 0310b076c793:/tmp/1.txt /tmp/
复制本地文件到容器内:docker cp 文件路径 容器:容器内路径
例:docker cp /tmp/1.txt 0310b076c793:/tmp/csm/
复制成功后返回如下
Successfully copied 3.58kB to 0310b076c793:/tmp/csm/
5、容器导入导出
(1)容器导出: docker export 容器id > 文件名.tar(导出tar文件位置在当前所在目录)
例:docker export 0310b076c793>cs.tar
(2)容器导入(从tar包中创建一个新的文件系统再导入为镜像):
cat 文件名.tar | docker import - 镜像名:镜像版本
例:cat cs.tar | docker import - ubuntu:2024.10.30
五、登录镜像仓库
1、配置登录仓库
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry=my_id
2、重新加载配置:systemctl daemon-reload
3、验证登录信息:docker login id -u user -p password
(1)验证成功如下所示
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
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
4推送镜像:docker push 192.168.xxx.xxx/docker-compose/onlyoffice:7.5.1
(1)、推送成功如下所示
The push refers to repository [192.168.xxx.xxx/docker-compose/onlyoffice]
66155d371e0b: Pushed
ddb00f670c2f: Pushed
7.5.1: digest: sha256:619f6ed4094f0153475f18d50bb032515ee62b1a6f3e7c470654935c0303485b size: 741
六、Dockerfile
1、dockerfile内容基础知识:
(1)每条保留字指令必须为大写字母且后面要跟随至少一个参数
(2)指令按照从上到下的顺序执行
(3)#表示注释
(4)每条指令都会创建一个新的镜像层并对镜像进行提交
2、Dockerfile执行流程:
(1)docker从基础镜像运行一个容器
(2)执行一条指令对容器做出修改
(3)执行类似于docker commit的操作提交一个新镜像
(4)docker再基于刚才提交的镜像运行一个新容器
(5)执行dockerfile中的下一条指令直到所有指令执行完成
3、保留字:
(1)FROM:指定基础镜像。
(2)RUN:在镜像中执行命令。例如:RUN apt-get update && apt-get install -y python3表示在镜像中执行更新并安装Python3的命令。
(3)COPY:复制本地文件到镜像中。例如:COPY . /app表示将当前目录中的所有文件复制到镜像中的/app目录下。
(4)ADD:类似于COPY指令,但还可以自动解压缩文件。例如:ADD app.tar.gz /表示将压缩包解压并复制到镜像根目录下。
(5)WORKDIR:设置工作目录。例如:WORKDIR /app表示将/app目录设置为工作目录。
(6)EXPOSE:声明容器运行时要监听的端口。例如:EXPOSE 80表示声明容器要监听的端口号为80。
(7)CMD:指定容器启动时要执行的命令。该指令只能在DockerFile中出现一次。例如:CMD ["python", "app.py"]表示容器启动时执行Python脚本app.py。
(8)ENTRYPOINT:类似于CMD指令,但它提供了固定的执行命令,并可以与CMD指令结合使用。例如:ENTRYPOINT ["nginx"]表示容器启动时将执行nginx命令。
(9)ENV:设置环境变量。例如:ENV API_KEY=123456表示在镜像中设置一个名为API_KEY的环境变量,并赋值为123456。
(10)ARG:定义构建参数。例如:ARG ENVIRONMENT=production表示定义一个名为ENVIRONMENT的构建参数,默认值为production。
4、构建dockerfile:docker build -t 镜像名:版本号 .
(1)例:docker build -t cs:2 .
输出如下:
[+] Building 100.4s (10/10) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 461B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [internal] load .dockerignore 0.4s
=> => transferring context: 2B 0.0s
=> CACHED [1/5] FROM docker.io/library/centos:latest 0.0s
=> [internal] load build context 48.4s
=> => transferring context: 506.83MB 48.4s
=> [2/5] RUN mkdir -p /usr/java/jdk1.0.8.251 0.6s
=> [3/5] ADD apache-pulsar-2.7.0-bin.tar.gz /usr/local/tomcat 21.5s
=> [4/5] ADD jdk-8u251-linux-x64.rpm /usr/local/tomcat 10.7s
=> [5/5] ADD zabbix-5.0.15.tar.gz /usr/local/tomcat 8.1s
=> exporting to image 10.2s
=> => exporting layers 9.6s
=> => writing image sha256:370df0b65d37d192104ee126a19e34da2d043e579f0364a62dcc4ac9f8a2168b 0.0s
=> => naming to docker.io/library/cs:2
(2)运行完成后查看镜像:docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
cs 2 370df0b65d37 23 seconds ago 875MB
5、虚悬镜像
(1):镜像名及版本号为none
(2):镜像构建或删除时出现一些错误,导致镜像名跟版本号为none
(3):删除(docker rmi 镜像id)或打标签(docker tag 镜像名:版本号)
七、docker_network(docker网络)
注:linux的网络接口:
(1)ens33代表着以太网接口,其中en 表示以太网,s"表示它是一个 PCI Express 热插拔槽中的设备,数字部分则用于区分不同的设备。
(2)lo是回环接口的简称,是一个虚拟网络接口,它允许主机向其自身发送网络流量。
(3)virbr0:、virbr0:这个接口代表了一个虚拟桥接器(Bridge),它用于连接虚拟机(VMs)之间的网络,或者将虚拟机连接到宿主机的物理网络上。通过 virbr0,虚拟机可以像物理机器一样在网络中进行通信。默认情况下,virbr0 通常会配置一个NAT(网络地址转换)网络,这样虚拟机可以通过宿主机访问外部网络,而外部网络无法直接访问虚拟机。
1、当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,宿主机上以Bridge模式启动的容器会链接到这个虚拟网桥上。docker0默认地址172.17.0.0/16。虚拟网桥的工作方式和物理交换机类似,这样宿主机上的所有容器就通过docker0连在一个二层网络中,再通过docker0和宿主机网卡ens33交互
2、docker网络默认三大模式:
(1)bridge模式:容器拥有独属于自己的虚拟网卡和和虚拟IP等网络资源,它们分别通过docker0虚拟网卡与宿主机的eth0网卡交互,进而和外界网络交互(默认)使用--network bridge指定,默认使用docker0
(2)host模式:容器没有自己的任何独立的网络资源(比如:容器的IP、网卡和端口),完全和宿主机共享网络空间(弊端:同一个端口只能同时被一个容器服务绑定)使用--network host指定
例:
[root@localhost docker]# docker run -it -d -p3832:3828 --network host ecebf0f33e0f
WARNING: Published ports are discarded when using host network mode
1a02e5ae9ff10fa1a6c7772d6de9909625f73d9771834e8fef6aadfe8edd24cf
[root@localhost docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a02e5ae9ff1 ecebf0f33e0f "bash" 3 seconds ago Up 2 seconds competent_mclean
bbf403fec3fb ubuntu "/bin/bash" 4 hours ago Up 4 hours 0.0.0.0:8059->8060/tcp, :::8059->8060/tcp ceshi
4cfcf157b99e 7a4f956409a2 "/bin/bash" 3 days ago Up 4 hours 84/tcp, 0.0.0.0:2929->8384/tcp, :::2929->8384/tcp thirsty_dubinsky
注:ps查看容器的时候没有端口,上面描述的时候有说过host是跟宿主机共享网络,而且在上面也有一个告警信息:WARNING: Published ports are discarded when using host network mode翻译过来就是--警告:使用主机网络模式时,已发布的端口将被丢弃。
(3)none模式:不配置任何网络接口,没有网络连接,没有任何网络设备。容器无法与外部通信,只能通过 localhost 访问。使用--network none指定
(4)container模式:新创建的容器不会创建自己的网卡和ip,而是和一个指定的容器共享ip跟端口。使用--network container:NAME或容器id指定
3、常用命令:docker network ls:查看docker网络
(1)查看网络模式命令:docker network ls
NETWORK ID NAME DRIVER SCOPE
51d6e0a64549 bridge bridge local
65e0a886c6dc host host local
4b3ea9c26e76 none null local
(2)docker network inspect 网络名字:查看网络详细信息
[root@localhost docker]# docker network inspect aa
[
{
"Name": "aa",
"Id": "7f33f661875c32a2db5216903db99830ad403597630ef280c18aac1f69414255",
"Created": "2024-11-04T13:52:44.665438889+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": {},
"Options": {},
"Labels": {}
}
]
(3)创建docker网络:docker network create docker_name
docker network create aa
7f33f661875c32a2db5216903db99830ad403597630ef280c18aac1f69414255
(4)删除docker网络:docker network rm docker_name
docker network rm aa
aa
4、自定义network网络
(1)新建一个自定义网络:docker network create my_bridge(类型还是bridge)
查看是否创建成功:[root@localhost docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
51d6e0a64549 bridge bridge local
65e0a886c6dc host host local
da7f90efd4d1 my_bridge bridge local
4b3ea9c26e76 none null local
(2)容器加入自定义网络:
docker run -it -d -p8080:8081 --name cs1 --network my_bridge 7a4f956409a2 bash
docker run -it -d -p8082:8090 --name cs2 --network my_bridge 7a4f956409a2 bash
处于同一定义网络中后可以互ping服务名:
[root@localhost docker]# docker exec -it 2f2b87a7f472 bash
[root@2f2b87a7f472 local]# ping cs1
PING cs1 (172.19.0.2) 56(84) bytes of data.
64 bytes from 2f2b87a7f472 (172.19.0.2): icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 2f2b87a7f472 (172.19.0.2): icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 2f2b87a7f472 (172.19.0.2): icmp_seq=3 ttl=64 time=0.039 ms
[root@localhost docker]# docker exec -it 97751cb70f1e bash
[root@97751cb70f1e local]# ping cs2
PING cs2 (172.19.0.3) 56(84) bytes of data.
64 bytes from 97751cb70f1e (172.19.0.3): icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from 97751cb70f1e (172.19.0.3): icmp_seq=2 ttl=64 time=0.031 ms
64 bytes from 97751cb70f1e (172.19.0.3): icmp_seq=3 ttl=64 time=0.030 ms
64 bytes from 97751cb70f1e (172.19.0.3): icmp_seq=4 ttl=64 time=0.032 ms
八、docker-compose
1、docker-compose.yml 文件格式示例:
version: '3.8' # 指定Compose文件的版本
services:
web: # 服务名
image: nginx:latest # 使用的镜像
ports:
- "8080:80" # 端口映射
volumes:
- ./html:/usr/share/nginx/html # 卷挂载
networks:
- frontend # 网络
deploy:
replicas: 6 # 部署副本数量
update_config:
parallelism: 7
delay: ½m # 更新延迟
db: # 另一个服务
image: postgres:9.ⅹ
volumes:
- db-data:/var/lib/postgresql/data # 数据卷
networks:
- backend
environment:
POSTGRES_PASSWORD: example # 环境变量
volumes:
db-data: # 定义数据卷
networks:
frontend: # 定义网络
backend:
2、常用命令:
docker-compose up - 启动所有定义在 docker-compose.yml 中的服务。
docker-compose up -d - 在后台启动服务。
docker-compose down - 停止并移除所有定义在 docker-compose.yml 中的服务及其网络。
docker-compose ps - 显示所有服务的状态。
docker-compose build - 构建或重建服务。
docker-compose restart - 重启服务。
docker-compose stop - 停止服务但不移除容器。
docker-compose start - 启动之前已停止的服务。
docker-compose rm - 移除停止的服务容器。
docker-compose config - 检查 docker-compose.yml 文件的配置,并显示解析后的配置
#不是很充足,也欢迎大家补充