docker学习
docker在Linux下安装
-
安装工具包 sudo yum -y install yum-utils device-mapper-persistent-data lvm2
-
设置仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
-
安装 sudo yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
设置开机启动 sudo systemctl start docker && sudo systemctl enable docker
-
设置用户权限 sudo usermod -aG docker $USER newgrp docker
-
检查服务状态 systemctl status docker
-
查看版本号 sudo docker version
-
运行一个image(镜像) sudo docker run hello-world
docker镜像源更换
-
cd /etc/docker
-
sudo tee /etc/docker/daemon.json <<-'EOF'
-
{
-
"registry-mirrors":["https://cdwvkc3j.mirror.aliyuncs.com"]
-
-
}
-
EOF
-
-
sudo systemctl daemon-reload
-
sudo systemctl restart docker
docker镜像管理
CH4 【
-
查看帮助
docker --help
-
查看版本
docker version
-
查看初始化信息
docker info
-
列出本地镜像
docker image ls
-
在仓库搜索镜像
docker search centos --no-trunc --limit 5 --filter "is-official=true" (搜索含centos,不截断,前五行,official为true)
仓库一般提供web api,得到镜像的列表 https://cdwvkc3j.mirror.aliyuncs.com/v2/_catalog?n=1
-
镜像下载 docker image pull alpine
-
查看镜像历史 docker image history alpine
-
给镜像加标签 docker image tag hello-world:latest myhelloworld:v0227
-
删除镜像
docker image rm alpine
-
删除遗留的临时镜像文件,或未被使用的镜像
docker image prune
-
查看镜像的详细信息
docker image inspect hello-world
-
导出镜像到本地
docker image save -o hello-world.tar.gz hello-world
-
导出镜像
docker image load -i hello-world.tar.gz
docker容器命令
-
创建容器,并不运行
docker container create -i -t --name helloworld hello-world
-
列出容器,状态有【created,restarting,running,removing,paused,exited,or dead】
docker container ls -a
-
删除容器
docker container rm $(docker container ls -qa)
-
运行容器
docker container run -it --name alpine2 alpine /bin/sh
-
在后台运行容器
docker container run -d --name helloworld2 hello-world
docker container run -idt --name alpine alpine /bin/sh
-
容器的启动/停止/暂停/重启
docker container start alpine2
docker container stop alpine2
docker container pause alpine2
docker container restart alpine2
-
运行一个新容器,并为其分配伪终端
docker container run -idt --name alpine2 alpine
以交互方式运行容器中的sh命令
docker container exec -it alpine2 sh
在容器中创建一个空文件
docker container exec -d alpine2 touch /tmp/abc.txt
-
复制文件
-
docker container cp alpine:/tmp/mysqlpwd ./mysqlpwd1#从容器复制到主机
-
docker container cp ./mysqlpwd alpine:/tmp#从主机复制到容器
-
-
日志
-
docker container logs alpine
-
docker container run -itd --name hello hello-world
-
docker container logs hello
-
-
查看容器的详细信息 docker container inspect alpine
-
将容器打包构建成一个新的镜像
docker container commit -a "inspur" -m "msg" alpine alpine0229:v1
-
导出容器
docker container export -o alpine0229.tar alpine
-
查看容器的进程信息
-
docker container run -itd --name alpine alpine
-
docker container top alpine
-
-
修改容器的名称
docker container rename alpine alpine-linux
-
删除所有已停止的容器
docker container prune
-
强制关闭当前容器
docker container kill alpine02281
-
查看容器文件系统的修改
docker container diff alpine-linux
-
查看容器的端口
docker container port alpine-linux
-
显示容器资源的使用情况
docker container stats alpine-linux
docker仓库管理
-
搭建私有仓库
docker image pull registry
docker run -d -p 5000:5000 --restart always --name local-registry registry
-
推送镜像到仓库 docker image tag hello-world:latest localhost:5000/hello-world:1 docker image push localhost:5000/hello-world:1
-
通过API查看仓库的镜像 curl localhost:5000/v2/_catalog
-
从私有仓库下载镜像 docker image pull localhost:5000/hello-world:1
docker数据管理
-
创建数据卷
docker volume create myvolume
-
查看数据库列表 docker volume ls
-
查看数据卷信息 docker volume inspect myvolume
-
运行容器时指定数据卷,使用-v docker container run --name alpine0301 -v -idt myvolume:/mydata alpine
-
如果之前数据卷不存在,则进行创建 docker container run --name alpine0301 -idt -v myvolume2:/mydata alpine
-
运行容器时指定数据卷,使用--mount docker container run --name alpine2 -idt --mount type=volume,target=/mydata,src=myvolume alpine
-
绑定挂载
-
docker container run -idt --name alpine -v /home/centos/abc/:/mydata alpine
-
docker container run -idt --name alpine2 --mount type=bind,target=/mydata1,src=/home/centos/abc,readonly alpine
-
-
创建数据卷容器
-
docker container run --name alpine --mount type=volume,target=/mydata,src=myvolume alpine
-
docker container run -it --volumes-from alpine alpine
-
-
数据卷容器的备份
-
docker container run --name alpine --mount type=volume,target=/mydata,src=myvolume alpine
-
使用--volumes-from 引用上方数据卷容器alpine,挂载容器的数据卷(即/mydata); 使用-v $(pwd):/backup参数来挂载本地的当前目录到容器的/backup目录
-
docker container run --volumes-from alpine -v $(pwd):/backup alpine tar zcvf /backup/data.tar.gz /mydata
-
-
-
数据卷容器的还原
-
docker container run --name alpine3 --mount type=volume,target=/mydata,src=myvolume3 alpine
-
docker container run -v /home/centos/abc:/backup --volumes-from alpine3 alpine tar zxvf /backup/data.tar.gz -C /mydata
Dockerfile
Dockerfile命令
-
FROM:指定基础镜像,任何Dockerfile中的第一条指令必须为FROM指令,例如 FROM ubuntu:20.04。
-
MAINTAINER指令:指定镜像维护者信息,例如 MAINTAINER ZYD。
-
LABEL指令:指定生成镜像的元数据标签的信息,例如 LABEL version="1.0"。
-
RUN:运行指定Linux命令,每条RUN指令将在当前镜像的基础上执行指令命令,并生成新的镜像层,例如 RUN apt-get update && apt-get install -y gcc。
-
CMD:指定容器启动时要运行的命令,例如 CMD [“python”, “app.py”]。
-
EXPOSE:声明当前容器对外暴露出的端口号,例如 EXPOSE 80。
-
VOLUME指令:指定一个数据卷的挂载点,指定容器内的数据存储路径,主机数据卷默认挂载到/var/lib/docker/volumes/目录中,例如 VOLUME /etc/docker/app1。
-
-
WORKDIR:设置工作目录,例如 WORKDIR /app。
-
ENV指令:在构建镜像过程中指定环境变量,例如 ENV JAVA_HOME=/opt/jdk1.8.0_121。
-
ADD指令:将复制指定的<srt>路径下的内容到容器中的<dest>下,例如 ADD app.tar.gz /opt/
-
COPY:将文件从构建上下文复制到镜像内部,例如 COPY ./app /app。
-
ONBUILD指令:配置当所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作指令,例如 ONBUILD RUN echo "copy success"。
-
USER指令:指定运行容器时的用户名或UID,例如 USER ZYD。
-
ARG指令:指定一些镜像内使用的参数(例如版本号信息等),这些参数在docker build命令时才以—build-arg <varname>=<value>格式传入。例如 ARG VERSION。
-
Dockerfile构建过程
1. 编写Dockerfile文件。注意(规则):
1. 每条保留字指令都必须为大写字母,且后面要至少跟随一个参数;
2. 指令按照从上到下,顺序执行;
3. #表示注释
4. 每条指令都会创建一个新的镜像层,并对镜像进行提交。
2. docker build构建镜像;
3. docker run启动容器
dockerfile构建示例1
vim Dockerfile1
FROM alpine:latest
ENV MYPATH /home
WORKDIR $MYPATH
dockerfile测试
-
docker image build -f Dockerfile1 -t alpine0304:v1 . #运行
-
docker image ls #查看
dockerfile构建示例2
vim Dockerfile2
FROM alpine:latest
ENV MYPATH /home
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories
RUN apk update
WORKDIR $MYPATH
USER root
RUN apk add curl
dockerfile测试
-
docker image build -f Dockerfile2 -t alpine0304:v2 . #运行dockerfile
-
curl www.baidu.com #直接运行curl进行测试
-
docker container run -it alpine0304:v2 curl www.baidu.com #利用容器运行curl
dockerfile构建示例3
vim Dockerfile3
FROM alpine:latest
MAINTAINER inspur
LABEL description="desc image"
COPY mysqlpwd /home
ONBUILD RUN echo "copy success"
ARG VERSION
LABEL version=$VERSION
dockerfile测试
-
docker image build -f Dockerfile3 --build-arg VERSION=2.0 -t alpine0304:v3 . #--build-arg=[] 设置镜像创建时的变量
-
docker image inspect alpine0304:v3 #查看详细信息
-
vim Dockerfile31
-
FROM alpine0304:v3
ENV MYPATH /home -
docker image build -f Dockerfile31 -t alpine0304:v31 .
-
Dockerfile31 继承 Dockerfile3 镜像,会执行ONBUILD里的命令
dockerdfile构建示例4
vim DockerfileNginx
#基于alpine镜像,安装nginx web服务器,发布web程序
FROM alpine:latest
#设置apk工具的国内repositories地址
RUN echo -e 'https://mirrors.aliyun.com/alpine/v3.6/main/\nhttps://mirrors.aliyun.com/alpine/v3.6/community/' > /etc/apk/repositories
#安装nginx
RUN apk update
RUN apk add nginx
#配置nginx,修改配置文件
COPY nginx.conf /etc/nginx/nginx.conf
#创建运行时需要的目录
RUN mkdir /home/www
RUN mkdir /run/nginx
#复制web程序
COPY index.html /home/www
#启动WEB服务
CMD ["nginx","-g","daemon off;"]
#开放80端口
EXPOSE 80
dockerfile测试
-
docker image build -f DockerfileNginx -t alpine-nginx:1.0 . #创建
-
docker container run -idt --name nginx -p 80:80 alpine-nginx:1.0 #容器运行 -p 端口映射
-
docker container ls #查看
-
curl localhost:80 #通过curl访问本机80端口验证
-
sudo firewall-cmd --add-port=80/tcp #再开一个80端口,使得window可以访问nginx
-
浏览器输入虚拟机IP地址可进行访问
dockerdfile构建示例5
vim Dockerfilejava
FROM docker.io/jeanblanchard/alpine-glibc
#安装JDK
COPY jdk-8u121-linux-x64.tar.gz /opt
#解压
RUN tar -zxvf /opt/jdk-8u121-linux-x64.tar.gz -C /opt
RUN rm /opt/jdk-8u121-linux-x64.tar.gz
#环境变量
ENV JAVA_HOME=/opt/jdk1.8.0_121
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
COPY test.jar /home
WORKDIR /home
CMD ["java","-cp","test.jar","org.zyd.HelloDocker"]
-
docker image build -f Dockerfilejava -t myjava:v1 . #下载镜像
-
docker container run myjava:v1 #运行镜像
docker网络管理
docker有四种网络网络模式
docker网络配置 | 配置 | 说明 |
---|---|---|
host模式 | -net=host | 容器和宿主机共享Network namespace。 |
container模式 | -net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | -net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
bridge模式 | -net=bridge | (默认为该模式) |
-
列出主机的网络
docker network ls
-
查看网络信息
docker network inspect demo-network
-
创建网络
docker network create --driver bridge demo-network
-
连接网络
docker network connect demo-network 1898ba918696
-
断开连接
docker network disconnect demo-network 1898ba918696
-
删除网络
docker network rm demo-network
docker compose
Docker Compose是一个工具,它使用YAML文件来定义Docker容器的配置。这个工具可以用来启动、停止和重启一组Docker容器。它使得在Docker环境中管理和编排容器变得简单。
示例
vim compose.yaml
services:
db:
image: mariadb:10.6.4-focal
command: '--default-authentication-plugin=mysql_native_password'
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:latest
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:
-
运行
docker compose up -d
-
查看日志 docker compose logs
-
查看运行的服务 docker compose ps
-
关闭服务 docker compose down
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术