Docker学习笔记
1. Docker介绍 Docker本身包含一个后台服务,我们可以利用Docker命令告诉Docker服务,帮助我们快速部署指定的应用。Docker服务部署应用时,首先要去搜索并下载应用对应的镜像,然后根据镜像创建并允许容器,应用就部署完成了。
2. Docker常见命令 2.1 常见命令
命令
说明
docker pull
拉取镜像
docker push
推送镜像到 Docker Registry
docker images
查看本地镜像
docker rmi
删除本地镜像
docker run
创建并运行容器(不能重复创建)
docker stop
停止指定容器
docker start
启动指定容器
docker restart
重新启动容器
docker rm
删除指定容器
docker ps
查看容器
docker logs
查看容器运行日志
docker exec
进入容器
docker save
保存镜像到本地压缩文件
docker load
加载本地压缩文件到镜像
docker inspect
查看容器详细信息
2.2 示例 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 docker pull nginx docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 605c77e624dd 16 months ago 141MB mysql latest 3218b38490ce 17 months ago 516MB docker run -d --name nginx -p 80:80 nginx docker ps docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" docker stop nginx docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" docker start nginx docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" docker inspect nginx docker exec -it nginx bash docker exec -it mysql mysql -uroot -p docker rm nginx docker rm -f nginx
2.3 命令别名 给常用Docker命令起别名,方便我们访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 vi /root/.bashrc 内容如下:alias rm ='rm -i' alias cp ='cp -i' alias mv ='mv -i' alias dps='docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}"' alias dis='docker images' if [ -f /etc/bashrc ]; then . /etc/bashrcfi
执行命令使别名生效
3. 数据卷 3.1 数据卷介绍 容器是隔离环境,容器内程序的文件、配置、运行时产生的容器都在容器内部,我们要读写容器内的文件非常不方便。数据卷(volume)是一个虚拟目录,是容器内目录与宿主机目录之间映射的桥梁
我们创建了两个数据卷:conf、html
Nginx容器内部的conf目录和html目录分别与两个数据卷关联。
而数据卷conf和html分别指向了宿主机的/var/lib/docker/volumes/conf/_data目录和/var/lib/docker/volumes/html/_data目录 这样以来,容器内的conf和html目录就 与宿主机的conf和html目录关联起来,我们称为挂载。此时,我们操作宿主机的/var/lib/docker/volumes/html/_data就是在操作容器内的/usr/share/nginx/html/_data目录。只要我们将静态资源放入宿主机对应目录,就可以被Nginx代理了。
3.2 数据卷命令
命令
说明
docker volume create
创建数据卷
docker volume ls
查看所有数据卷
docker volume rm
删除指定数据卷
docker volume inspect
查看某个数据卷的详情
docker volume prune
清除数据卷
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 docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx docker volume ls DRIVER VOLUME NAMElocal 29524ff09715d3688eae3f99803a2796558dbd00ca584a25a4bbc193ca82459flocal html docker volume inspect html [ { "CreatedAt" : "2024-05-17T19:57:08+08:00" , "Driver" : "local" , "Labels" : null, "Mountpoint" : "/var/lib/docker/volumes/html/_data" , "Name" : "html" , "Options" : null, "Scope" : "local" } ] ll /var/lib/docker/volumes/html/_data 总用量 8 -rw-r--r--. 1 root root 497 12月 28 2021 50x.html -rw-r--r--. 1 root root 615 12月 28 2021 index.htmlcd /var/lib/docker/volumes/html/_data vi index.html docker exec -it nginx bash
3.3 挂载本地目录或文件 数据卷的目录结构较深,如果我们去操作数据卷目录会不太方便。在很多情况下,我们会直接将容器目录与宿主机指定目录挂载。挂载语法与数据卷类似:
1 2 3 4 -v 本地目录:容器内目录 -v 本地文件:容器内文件
演示:
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 docker rm -f mysqlcd ~ docker run -d \ --name mysql \ -p 3306:3306 \ -e TZ=Asia/Shanghai \ -e MYSQL_ROOT_PASSWORD=123 \ -v ./mysql/data:/var/lib/mysql \ -v ./mysql/conf:/etc/mysql/conf.d \ -v ./mysql/init:/docker-entrypoint-initdb.d \ mysqlls -l mysql 总用量 4 drwxr-xr-x. 2 root root 20 5月 19 15:11 conf drwxr-xr-x. 7 polkitd root 4096 5月 19 15:11 data drwxr-xr-x. 2 root root 23 5月 19 15:11 initls -l data docker exec -it mysql mysql -uroot -p123 show variables like "%char%" ; +--------------------------+--------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8mb3 | | character_sets_dir | /usr/share/mysql-8.0/charsets/ | +--------------------------+--------------------------------+ show databases; +--------------------+ | Database | +--------------------+ | hmall | | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) use hmall; show tables; +-----------------+ | Tables_in_hmall | +-----------------+ | address | | cart | | item | | order | | order_detail | | order_logistics | | pay_order | | user | +-----------------+ +----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+ | id | user_id | province | city | town | mobile | street | contact | is_default | notes | +----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+ | 59 | 1 | 北京 | 北京 | 朝阳区 | 13900112222 | 金燕龙办公楼 | 李佳诚 | 0 | NULL | | 60 | 1 | 北京 | 北京 | 朝阳区 | 13700221122 | 修正大厦 | 李佳红 | 0 | NULL | | 61 | 1 | 上海 | 上海 | 浦东新区 | 13301212233 | 航头镇航头路 | 李佳星 | 1 | NULL | | 63 | 1 | 广东 | 佛山 | 永春 | 13301212233 | 永春武馆 | 李晓龙 | 0 | NULL | +----+---------+----------+--------+----------+-------------+---------------+-----------+------------+-------+ 4 rows in set (0.00 sec)
4. 镜像 4.1 构建自己的镜像 我们打包镜像也是分成这么几步:
准备Linux运行环境(java项目并不需要完整的操作系统,仅仅是基础运行环境即可)
安装并配置JDK
拷贝jar包
配置启动脚本
4.2 Dockerfile
指令
说明
FROM
指定基础镜像
ENV
设置环境变量,可在后面指令使用
COPY
拷贝本地文件到镜像的指定目录
RUN
执行 Linux 的 shell 命令,一般是安装过程的命令
EXPOSE
指定容器运行时监听的端口,是给镜像使用者看的
ENTRYPOINT
镜像中应用的启动命令,容器运行时调用
有人提供了基础的系统加JDK环境,我们在此基础上制作java镜像:
1 2 3 4 5 6 7 8 9 FROM openjdk:11.0-jre-buster ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone COPY docker-demo.jar /app.jar ENTRYPOINT ["java" , "-jar" , "/app.jar" ]
5. 自定义网络 容器的网络IP其实是一个虚拟的IP,其值并不固定 与某一个容器绑定
在自定义网络中,可以给容器起多个别名,默认的别名是容器名本身
在同一个自定义网络中的容器,可以通过别名互相访问
命令
说明
docker network create
创建一个网络
docker network ls
查看所有网络
docker network rm
删除指定网络
docker network prune
清除未使用的网络
docker network connect
使指定容器连接加入某网络
docker network disconnect
使指定容器连接离开某网络
docker network inspect
查看网络详细信息
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 docker network create hmall docker network ls NETWORK ID NAME DRIVER SCOPE 639bc44d0a87 bridge bridge local 403f16ec62a2 hmall bridge local 0dc0f72a0fbb host host local cd8d3e8df47b none null local docker network connect hmall mysql --alias db docker network connect hmall dd docker exec -it dd bash ping db PING db (172.18.0.2) 56(84) bytes of data. 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time =0.070 ms 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time =0.056 ms ping mysql PING mysql (172.18.0.2) 56(84) bytes of data. 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=1 ttl=64 time =0.044 ms 64 bytes from mysql.hmall (172.18.0.2): icmp_seq=2 ttl=64 time =0.054 ms
6. DockerCompose Docker Compose可以帮助我们实现多个相互关联的Docker容器的快速部署 。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
部署mysql,可以使用docker-compose.yml进行部署
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 version: "3.8" services: mysql: image: mysql container_name: mysql ports: - "3306:3306" environment: TZ: Asia/Shanghai MYSQL_ROOT_PASSWORD: 123 volumes: - "./mysql/conf:/etc/mysql/conf.d" - "./mysql/data:/var/lib/mysql" networks: - new networks: new: name: hmall
基本语法如下:
1 docker compose [OPTIONS] [COMMAND]
类型
参数或指令
说明
Options
-f
指定 compose 文件的路径和名称
-p
指定 project 名称。project 就是当前 compose 文件中设置的多个 service 的集合,是逻辑概念
Commands
up
创建并启动所有 service 容器
down
停止并移除所有容器、网络
ps
列出所有启动的容器
logs
查看指定容器的日志
stop
停止容器
start
启动容器
restart
重启容器
top
查看运行的进程
exec
在指定的运行中容器中执行命令
END