# docker实战小项目 **Repository Path**: breezewangsz/docker ## Basic Information - **Project Name**: docker实战小项目 - **Description**: 我的docker学习总结和笔记 - **Primary Language**: Docker - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-01-08 - **Last Updated**: 2024-05-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README

docker命令

1.安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,任意系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。 ```shell #下载docker #1.下载简化安装脚本 curl -fsSL get.docker.com -o get-docker.sh #2.使用脚本安装Docker 并指定其镜像源为aliyun sudo sh get-docker.sh --mirror Aliyun #启动docker #1.开机自启动 sudo systemctl enable docker #2.启动docker sudo systemctl start docker #创建docker用户组 sudo groupadd docker #将当前用户加入docker组 sudo usermod -aG docker $USER #判断是否下载好了(任选其一) #1.会输出服务端和应用端docker版本号 docker version #2.会输出docker消息 docker info #3.如过没有该镜像会下载该镜像并创建启动该容器打印出 hello world # 若已存在 则 执行创建容器并启动容器打印 hello world # 由此可以得知其流程 有直接运行 无去中央仓库下载 docker run hello-world ``` ## [仓库](https://hub.docker.com/) 用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置,有远程和本地仓库之分。 - 本地仓库 - 设置远程阿里云镜像仓库 - 1.获取镜像仓库地址 登陆阿里云控制台--->搜索容器镜像服务–-->镜像加速器–-->获取加速器地址 - 2.设置 ```bash sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["镜像仓库链接"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker ``` ## 镜像(images) ### 拉取镜像: ```bash 拉取镜像: docker pull ubuntu:20.04:拉取一个镜像 ``` ### 查找镜像: ```bash 查找镜像: docker images:列出本地所有镜像 docker images redis [-a]: 列出本地所有reids镜像 -a 为默认参数 docker images redis -q: 列出本地所有reids镜像id ``` ### 删除镜像: ```bash 删除镜像: (正常删除 没有运行过的镜像) docker image rm ubuntu:20.04(没有运行过的) 或 docker rmi ubuntu:20.04:删除镜像ubuntu:20.04 (强制删除 连镜像容器全删除了) docker image rm -f ubuntu:20.04 (批量删除) docker image rm -f $(docker images redis -q) 删除本地redis所有的版本 ``` ### 创建镜像 ```bash 创建镜像 docker [container] commit CONTAINER IMAGE_NAME:TAG:创建某个container的镜像 docker save -o ubuntu_20_04.tar ubuntu:20.04:将镜像ubuntu:20.04导出到本地文件ubuntu_20_04.tar中 docker load -i ubuntu_20_04.tar:将镜像ubuntu:20.04从本地文件ubuntu_20_04.tar中加载出来 ``` ## 容器(container) ### 查看本地容器 ``` docker ps -a:查看本地的所有容器 docker ps :查看本地所有运行的容器 ``` ### 仅创建容器 ```bash 创建容器 docker [container] create -it ubuntu:20.04:利用镜像ubuntu:20.04创建一个容器。 ``` ### 创建并启动容器(run): ```bash 创建并启动容器: 基础操作 docker [contaienr] run(容器内无法访问) docker [contaienr] run -itd ubuntu:20.04:创建并启动一个容器 映射端口 docker [contaienr] run -p 8080【宿主机】:8080【服务机】 tomcat:8.0 : 启动一个容器并使得服务机端口8080映射到宿主机端口8080 【防火墙在docker启动后不要变化否则报错见问题1】 后台启动 docker [contaienr] run -p 8080【宿主机】:8080【服务机】-d tomcat:8.0 :后台启动一个容器并使得服务机端口8080映射到宿主机端口8080 指定容器名称 docker [contaienr] run -d -p 8080【宿主机】:8080【服务机】--name mytomcat tomcat:8.0 : 后台启动一个容器并使得服务机端口8080映射到宿主机端口8080且名称为mytomcat ``` ### 停止,启动和重启容器 ```bash docker [container] start CONTAINER:启动容器 docker [container] stop CONTAINER:停止容器 docker [container] restart CONTAINER:重启容器 ``` ### 暂停恢复容器 ```bash docker [container] pause CONTAINER:暂停容器 docker [container] unpause CONTAINER:恢复容器 ``` ### 杀死删除容器 ```bash docker [container] kill id|name: 杀死容器 docker [container] rm CONTAINER:删除容器 docker rm $(docker ps -qa): 删除所有容器 docker container prune:删除所有已停止的容器 ``` ### 容器日志 ```bash docker [container] logs [OPTIONS] -t 加入时间戳 -f 跟随最新的日志打印 --tail 数字 显示最后多少条 ``` ### 进入容器 ```bash docker [container] attach id|name:进入容器 #和容器的bash进行交互 docker [container] exec -it【交互模式】 id|name bash: 进入容器 ``` ### 查看容器内运行进程 ```bahs docker top 容器id|name ``` ### 查看容器内细节指令 ```bash docker inspect 容器id|name ``` ### 容器与宿主机之间文件拷贝 ```bash docker cp id|name:/文件或目录 主机文件存放位置: 容器指定文件和目录到宿主机 docker cp 主机文件存放位置 id|name:/文件或目录: 宿主机到容器指定文件和目录 ``` ### 在容器中执行命令 ```bash' docker [container] exec CONTAINER COMMAND:在容器中执行命令 ``` ### 挂起容器 ```bash 挂起容器 注意 ctrl -d 会关闭容器 先按Ctrl-p,再按Ctrl-q可以挂起容器 ``` ### 容器数据卷机制(Data Volume) ```bash #实现容器数据与宿主机数据映射 (存储数据的容器一般要使用如redis mysql ...) #注意: 容器首次启动时设置 #使用: #1.绝对路径设置数据卷 #注意:会将容器路径的原始内容清空,始终以宿主机为主 docker run -v 宿主机绝对路径:容器内路径 (image) [OPTION] -ro only read(只读) 只能设置容器 docker run -d -p 8081:8080 --name mycat1 -v /usr/local/docker/test/:/usr/local/tomcat/webapps/aa tomcat:8.5.84-jdk8-corretto-al2 docker run -d -p 8080:8080 --name mytomacat -v /root/apps/:/usr/local/tomcat/webapps:ro #2.别名方式设置数据卷 docker run-v aa:/user/local/tomcat/webapps [image] #aa : 1.docker 数据卷别名 存在则直接使用不存在则自动创建 # 2.使用别名保存容器原始内容前提是对应路径不能存在内容 # # find / -name aa #其内容默认在 /var/lib/docker/volumes/ #3.别名到底是什么? 代表docker自身维护数据卷 #4.数据卷命令 #1.查看所有维护数据卷 docker volume ls #2.查看维护数据卷详细内容 docker inspect 数据卷名称,网桥名称,容器名称 #注意使用时如果与网桥重名优先网桥 #1. docker network inspect 网桥名称 #2. docker volume inpect 数据卷名称 #3.删除数据卷 docker volume rm 数据卷别名 #4.创建数据卷 docker volume create 数据卷别名 ``` ### 制作镜像 ```bash #1.打包镜像 docker save 镜像名 -o 名称+版本.tar docker export -o xxx.tar CONTAINER:将容器CONTAINER导出到本地文件xxx.tar中 #2.载入镜像 docker load -i 名称.tar docker import xxx.tar image_name:tag:将本地文件xxx.tar导入成镜像,并将镜像命名为image_name:tag #3.容器打包镜像 docker commit -m '描述' -a '作者' 容器id|name 打包镜像名称 docker commit -m 'deploy test project' -a 'wsz' tomcat:8.0 wsz-tomcat #4.区别 docker export/import与docker save/load的区别: export/import会丢弃历史记录和元数据信息,仅保存容器当时的快照状态 save/load会保存完整记录,体积更大 docker top CONTAINER:查看某个容器内的所有进程 docker stats:查看所有容器的统计信息,包括CPU、内存、存储、网络等信息 docker cp xxx CONTAINER:xxx 或 docker cp CONTAINER:xxx xxx:在本地和容器间复制文件 docker rename CONTAINER1 CONTAINER2:重命名容器 docker update CONTAINER --memory 500MB:修改容器限制 ``` ### 出现的问题 ``` 1.docker: Error response from daemon: driver failed programming external connectivity on endpoint 容器名 docker服务启动时定义的自定义链DOCKER被清除,重启即可 systemctl restart docker ``` ## mysql容器的使用 ### 运行mysql以及数据持久化(宿主机) ```bash #1.启动mysql 开发端口映射(3306)指定root用户密码才行 -e(environment) docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:8.0 #2.启动mysql 开发端口映射(3306)指定root用户密码才行 -e(environment) -d(后台运行) --name(指定名称) docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysqlw mysql:8.0 #3.启动mysql 开发端口映射(3306)指定root用户密码才行 -e(environment) -d(后台运行) --name(指定名称) --restart=always(总是运行) docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysqlw --restart=always mysql:8.0 #4.启动mysql 开发端口映射(3306)指定root用户密码才行 -e(environment) -d(后台运行) --name(指定名称) --restart=always(总是运行)数据持久化到宿主机 docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysqlw --restart=always -v /root/data:/var/lib/mysql mysql:8.0 docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d --name mysqlw --restart=always -v mysqlDate:/var/lib/mysql mysql:8.0 ``` ### 数据备份 ```bash #1.备份所有数据 docker exec 容器id sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > [/some/path/on/your/host/]all-databases.sql #2.备份指定库的数据 docker exec 容器id sh -c 'exec mysqldump --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > [/some/path/on/your/host/]all-databases.sql #3.备份指定库的结构不要数据 docker exec 容器id sh -c 'exec mysqldump --no-data --databases 库名 -uroot -p"$MYSQL_ROOT_PASSWORD"' > [/some/path/on/your/host/]all-databases.sql #4.远程连接借助工具 ``` ### 连接 ```mysql #1.修改本地连接root密码 alter user root@localhost identified with mysql_native_password by '123456'; FLUSH PRIVILEGES #2.修改远程连接root密码 alter user root@'%' identified with mysql_native_password by '123456'; FLUSH PRIVILEGES; ``` ### 出现的问题 ``` 连接时出现问题2058 修改一下远程连接的密码就🆗 ``` ## redis容器的使用 ### 1.容器下载 ```bash docker pull redis:版本 ``` ### 2.运行 ```bash #1.启动redis 映射端口 6379 docker run -p 6379:6379 redis:7.0.4【容器id|name】 #2.启动redis 映射端口 6379 后台启动 -d 修改名字 --name 总是启动 --restart=always docker run -p 6379:6379 -d --name 'wsz-redis' --restart=always redis:7.0.4【容器id|name】 #3.启动redis 映射端口 6379 后台启动 -d 修改名字 --name 总是启动 --restart=always 开启aof持久化 docker run -p 6379:6379 -d --name 'wsz-redis' --restart=always --appendonly yes redis:7.0.4【容器id|name】 #reids持久化有两种 #1.rdb: 快照 redis服务某一时刻数据以快照文件的形式写入磁盘 #2.aof: redis服务将所有redis客户端的写操作以命令的方式记录 #4.启动redis 映射端口 6379 后台启动 -d 修改名字 --name 总是启动 --restart=always 开启aof持久化 映射数据文件外部 docker run -p 6379:6379 -d --name 'wsz-redis' --restart=always -v/ [/some/path/on/your/host/]:/data --appendonly yes redis:7.0.4【容器id|name】 ``` ### 3.自定义配置 ```bash #1.如何获取redis配置文件 1.下载对应的配置文件进行修改 传到容器或挂载到容器后使用其启动 2.创建指定配置文件名称直接书写修改属性即可 (推荐) #2.上传到宿主机指定目录 例如 /usr/local/redisconf/redis.conf #3.数据卷配置挂载 docker run -d -p 6379:6379 --restart=always -v /usr/local/redisconf/:/data redis:7.0.4 redis-server /data/redis.conf #1.开启aof appendonly yes #2.aof文件名称为wsz.aof appendfilename "wsz.aof" ``` ## nginx容器的使用 ### 1.容器下载 ```bahs docker pull nginx:1.19.10 ``` ### 2.运行 ```bash #1.启动nginx 映射端口80 docker run -p 80:80 nginx:1.19.10 #2.启动nginx 映射端口80 后台启动 -d 总是启动 --restart=always 指定名称 --name nginx-wsz docker run -p 80:80 -d --restart=always --name nginx-wsz nginx:1.19.10 #3.启动nginx 映射端口80 后台启动 -d 总是启动 --restart=always 指定名称 --name nginx-wsz 加载配置 -v 宿主机/容器(/etc/nginx/nginx.conf) docker run -p 80:80 -d --restart=always --name nginx-wsz -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10 ``` ### 3.配置 ```bash #1.方向代理负载均衡 #1.docker cp 容器id|name:/etc/nginx/nginx.conf 本地 docker cp 容器id|name:/etc/nginx/nginx.conf:/usr/local/docker/nginx/conf/nginx.conf #2.修改完后运行 docker run -p 80:80 -d --restart=always --name nginx-wsz -v /usr/local/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf nginx:1.19.10 #2.nginx 服务器 docker run -p 80:80 -d --restart=always --name nginx-wsz -v /usr/local/docker/nginx/html/:/usr/share/nginx/html/ nginx:1.19.10 ``` ## 网桥 ### 1.网桥类型 | NETWORK ID | NAME | DRIVER | SCOPE | | ---------- | ------ | ------ | ----- | | 213... | bridge | bridge | local | | 66b... | host | host | local | | 083... | none | null | local | ### 2.创建网络自定义网桥 ```bash docker network create -d bridge[默认] 网络名称 ``` ### 3.查看网络 ```bash docker network ls ``` ### 4.查看某个网络细节 ```bash docker network inspect ``` ### 5.删除网络 ```bash #删除指定的网络 docker network rm 网络名 #删除没使用的所有网络 docker network prune 删除没使用的所有网络 ``` ### 6.运行多个容器在指定网络 ```bash #启动时确认容器使用那个网络 docker run -d --network 网络名称 容器id|name #启动后容器加入那个网络 docker network connect 网络名 容器id|name ``` ## Dockerfile ```dockerfile #基于这个镜像进行构建,必须作为Dockerfile的第一个指令出现。 - FROM FROM 镜像名:版本 #构建镜像时需要的命令 - RUN RUN 构建镜像时需要的命令 #指定在容器创建后,终端进来的工作位置,如果这个目录不存在,它将被创建。 - WORKDIR WORKDIR 目录 #构建镜像过程中设置环境变量 - ENV ENV 变量=值 设置环境变量,用的时候这样:$变量。 #复制宿主机目录下文件或远程文件到容器指定路径的中 - ADD ADD 本地文件路径/远程文件url 容器中路径 #复制宿主机目录下文件或远程文件到容器指定路径的中 - COPY COPY 拷贝文件到镜像 #数据卷 - VOLUME #指定容器启动时执行命令 - CMD CMD 命令 指定容器启动时执行的命令,只有最后一个(所有容器Dockerfile的CMD的最后一个)才会生效。 #指定容器启动时执行命令 -ENTRYPOINT 指定容器启动时执行的命令,一般搭配CMD使用,不修改的部分放这 - # 注释 #例子 FROM openjdk:8-jre ENV APP_PATH=/apps WORKDIR $APP_PATH ADD blog-0.0.1-SNAPSHOT.jar $APP_PATH/app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar"] CMD ["apps.jar"] ``` ## docker-compose ### 1.安装 ```bash #1.github 下载 sudo curl -L https://github.com/docker/compose/releases/download/v2.15.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #1.daocloude下载 sudo curl -L https://get.daocloud.io/docker/compose/releases/download/V2.14.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose #2.添加可执行权限 sudo chmod +x /usr/local/bin/docker-compose #3.检测是否安装成功 docker compose --version docker-compose version V2.14.1, build 1719ceb ``` ### 2.使用指令 ```bash docker compose up -d【后台启动】启动 docker compose down 关闭容器 docker compose stop 关闭容器 docker compose config 检验docker compose 编写是否正确 docker compose logs [服务名] 查看服务日志 docker compose stop命令将停止运行的容器,但不会删除它们。 docker compose down命令将停止运行的容器,并且会删除已停止的容器以及已创建的所有网络。 我们可以down进一步迈出第一步,并添加-v标记以删除所有卷。这对于通过运行在环境中进行完全重置非常有用docker-compose down -v。 ``` ### 3.编写模块命令 ![命令](https://cdn.acwing.com/media/article/image/2023/01/10/239933_af97a29790-BIR3M~TH9([%7DV)CZ~%60M$Q2L.png) ```yaml #docker-componse项目版本号 version: "3.0" services: tomcat: #container_name: tomcat01 #代表给容器一个指定名称 推荐不写系统默认 image: tomcat:8.0 #代表使用的镜像 ports: #端口映射 - 8080:8080 networks: #设置网桥 - project #可以配多个 tomcat01: #container_name: tomcat01 #代表给容器一个指定名称 推荐不写系统默认 image: tomcat:8.0 #代表使用的镜像 ports: #端口映射 - 8081:8080 networks: #设置网桥 - project redis: image: redis:7.0.4 #代表使用的镜像 ports: #端口映射 - "6380:6379" #可以使用引号 restart: always #总是启动 volumes: #给容器和宿主机指定数据卷 - /usr/local/docker/redis-data/:/data command: redis-server /data/redis.conf #容器启动后执行的命令 networks: #设置网桥 - project mysql: image: mysql:8.0.31 #代表使用的镜像 ports: #端口映射 - "3306:3306" environment: #代表给容器指定启动环境 - "MYSQL_ROOT_PASSWORD=root" #类似 docker run -e "MYSQL_ROOT_PASSWORD=root" volumes: #给容器和宿主机指定数据卷 类似 docker run -v 使用绝对路径时必须先创建 - /root/mysqldatas:/var/lib/mysql #绝对路径 - mysqlData:/var/lib/mysql #相对路径 需要声明 networks: #设置网桥 - project apps: #build: ./ #默认在当前目录 build: context: ./ #指定Dockerfile上下文目录 dockerfile: Dockerfile #指定Dockerfile文件名称 ports: - "3000:3000" depends_on: #依赖与什么 - redis - mysql networks: #设置网桥 - project volumes: mysqlData: #声明数据卷别名 networks: #声明网桥 project: ``` ### 出现的问题 ``` docker-compose报错,/usr/local/bin/docker-compose: line 1: {error:Document not found}: 使用docker compose 即可 ``` ## [docker中文文档](https://vuepress.mirror.docker-practice.com/)