容器(docker)安装docker
文章目录
Docker认识
官网:https://www.docker.com/
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/
Windows安装
桌面版安装地址:
https://www.docker.com/products/docker-desktop
替换源地址:
https://registry.docker-cn.com
添加: “registry-mirrors”:[“https://registry.docker-cn.com”,“https://docker.mirrors.ustc.edu.cn”],
可以在/etc/docker/daemon.json中配置,也可以在docker.service中修改,效果一样。
修改镜像路径到d盘:
参考文档:https://blog.csdn.net/u013948858/article/details/111464534
默认存储路径:
wsl --export docker-desktop-data "D:\\docker-desktop-data.tar"
wsl --unregister docker-desktop-data
wsl --import docker-desktop-data "D:\\docker\\wsl" "D:\\docker-desktop-data.tar" --version 2
注意1:
双击打开显示,docker desktop stopped:
解决方法: C:\Users<username>\AppData\Roaming\Docker\settings.json, and set “wslEngineEnabled”: true
注意2:
默认安装是在C盘,比较占用空间。
在安装之前,创建到D盘里:
管理员运行cmd命令:
mklink /j "C:\Program Files\Docker" "D:\Program Files\Docker"
阿里云镜像配置
Docker 安装软件redis
Docker 官方镜像仓库查找 Redis :https://hub.docker.com/
本地命令行输入:
docker run -d -p 6379:6379 --name redis redis:latest
安装结束之后,在docker desktop里面就可以看到redis:
点击进去可以看到,当前redis的log日志、inspect版本和端口、stats占用内存等。
进入redis的终端:
docker命令参考:https://docs.docker.com/engine/reference/commandline/run/
Docker安装wordpress
拷贝到文件:docker-compose.yml
powershell运行安装:
docker-compose up -d
安装结束后,docker窗口查看
浏览器查看:
Docker的常用命令
帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker --help # 帮助命令
帮助文档地址:https://docs.docker.com/engine/reference/commandline
镜像命令
docker images 查看所有本地的主机上的镜像
解释:
REPOSITORY 镜像的仓库源
TAG 镜像标签
IMAGE ID 镜像id
CREATED 镜像的创建时间
SIZE 镜像的大小
docker images --help
可选项:
-a, --all 列出所有的镜像
-q, --quiet 只显示镜像ID
docker search 搜索镜像
docker search --help
可选项:
通过收藏来过滤
–filter=STARS=100 # 搜索出来的镜像 收藏数量大于100
docker pull 下载镜像
docker pull 镜像名称 [:tag]
docker pull mysql # 不指定版本 下载最新的
docker pull mysql:5.7 # 指定版本下载 官网要有的
docker rmi 删除镜像
官网地址:https://docs.docker.com/engine/reference/commandline/images/
容器命令
有了镜像才可以新建容器,下载一个centos镜像来学习
新建容器并启动
docker run -it centos /bin/bash
映射外路径启动docker run -v D:\A_Project\docker\centos:/home --name centos -it centos
列出所有运行的容器
docker ps -a # 查看当前所有容器
docker ps # 查看正在运行的容器
docker ps -a -n=1 # 列出最新创建的容器 n为个数
退出容器
exit # 直接退出容器
ctrl +P+Q # 容器不停止退出
删除容器
docker rm 容器id # 删除指定id的容器
docker rm -f $(docker ps -aq) # 删除所有的容器
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
其他常用命令
查看日志
# docker logs -f -t --tail 最后条数 容器ID
docker logs -f -t --tail 100 5bf2312ac02f # 显示最后100条日志
docker logs -tf # 显示全部日志
查看容器进程信息ps
# docker top 容器ID
PS C:\Users\taohy> docker top 5bf2312ac02f
UID PID PPID C STIME TTY TIME CMD
root 1667 1646 0
查看镜像的元数据
docker inspect 容器ID
进入当前正在运行的容器
# 我们的容器通常是使用后台运行的方式,需要进入容器,修改一些配置。
# 命令
docker exec -it 容器ID /bin/bash
在进入容器之后,输入命令:
apt-get update
# 安装vim命令
apt-get install vim
# 安装ifconfig命令
apt-get install net-tools
# 安装ping命令
apt-get install iputils-ping
从容器内拷贝文件到主机上
# 命令 docker cp 容器ID:容器内路径 目的的主机路径
PS C:\Users\taohy> docker cp 53359cb5303a:/home/test.py d:/
# 上面实现的是将 容器内部的/home/test.py 拷贝到主机D盘
# 拷贝是一个手动过程,未来我们使用-v卷的技术
小结
作业
部署Nginx
1. 搜索镜像 # 建议官网docker hub搜索
2. 下载镜像 # pull
# -d 后台运行
# --name 给容器命名
# -p 主机端口:容器内部端口
4. 启动镜像
docker run -d --name nginx01 -p 1314:80 nginx
5. 运行测试
curl http://localhost:1314
6. 进入容器
docker exec -it 42661a9e38d9 /bin/bash
7. 查看路径
whereis nginx
思考问题:我们每次改动nginx配置见,都需要进入容器内部?十分麻烦,如何在主机修改文件,容器内部就直接修改?-v 数据卷!
搜索镜像:
启动镜像:
运行测试:
部署Tomcat
# docker 运行
docker run -it --rm -p 1314:8080 tomcat:9.0
# 访问网址 阉割版
http://localhost:1314/
# 进入容器,拷贝文件到webapps
cp -r webapps.dist/* webapps
# 访问网址
http://localhost:1314/
访问网址,阉割版:
commit 镜像
docker commit 提交容器成为一个新的版本
# 命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker commit -m="add webapps" -a="taohy" 3c070f4da805 tomcat_taohy:1.0
实战测试
# 1. 启动一个默认的tomcat
# 2. 发现这个默认的tomcat是没有webapps应用,官方镜像默认webapps下面是没有文件的!
# 3. 我自己拷贝进去了基本的文件
# 4. 将我们操作过的容器通过commit提交为一个镜像!我们以后就使用我们改过的镜像即可,这就是我们自己的一个修改镜像。
用docker images命令查看新增的镜像:
Docker数据卷
卷技术,实际就是将容器内的目录,挂在到主机上。
总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的。
使用数据卷
方式一:命令行 -v
docker run -it -v 主机目录:容器目录
实战:安装Mysql
思考:mysql的数据持久化问题
# 搜索
docker search mysql
# 拉取
docker pull mysql:5.7
# 查看镜像
docker images
# 启动 运行容器 需要挂在容器 配置密码
# 官网 $ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
-d 后台运行
-p 端口映射
-v 卷挂载 多个对应多个-v
-e 环境配置
--name 容器名字
docker run -d -p 33061:3306 -v D:\docker\mnt\mysql\conf:/etc/conf.d -v D:\docker\mnt\mysql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
主机工具测试mysql连接:
主机文件映射位置:
容器内部文件和外机映射文件比对:(任何一端编辑之后,都会同步进行)
假设我们将容器删除,发现,我们挂在到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能。
具名和匿名挂载
匿名挂载:
-v 容器内路径 不指定容器外路径
具名挂载:
如何区分匿名挂载和具名挂载:
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /主机路径:容器内路径 # 指定路径挂载
初识DockerFile
DockerFile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本一个个的命令,每个命令都是一层。
数据卷容器
多个mysql实现数据共享
# mysql docker01
docker run -d -p 33061:3306 -v D:\docker\mnt\mysql\conf:/etc/conf.d -v D:\docker\mnt\mysql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# mysql docker02
# 通过--volumes-form mysql01实现数据同步
docker run -d -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-form mysql01 mysql:5.7
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用。
但是一旦你持久化到了本地,这时候,本地的数据是不会删除的。
DockerFile
构建步骤:
- 编写一个dockerfile文件
- docker build 构建成为一个镜像
- docker run 运行镜像
- docker push 发布镜像(DockerHub 阿里云镜像)
以centos为例,在docker hub上查看:
点击版本信息,跳转到github的dockerfile:
很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
官方既然可以制作镜像,那我们也可以!
DockerFile的构建过程
基础知识:
- 每个保留关键字(指令)都是必须大写字母
- 执行从上到下顺序执行
- 表示注释
- 每一个指令都会创建提交一个新的镜像层,并提交!
Dockerfile的步骤:
DockerFile:构建文件,定义一切的步骤,源代码
DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品!
Docker容器:容器就是镜像运行起来提供的服务器
DockerFile的指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这是tomacat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 Dockerfile,这个时候就会运行onbuild
COPY # 类似add,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量
实战测试
DockerHub中99%的镜像都是从基础镜像过来的From scratch,然后配置需要的软件和配置。
# 创建一个自己的镜像
新建文件mydockerfile-centos
# build镜像
docker build -f mydockerfile-centos -t mycentos:0.1 .
# docker history imagesID
我们平时查看镜像是如何做的,通过上面的命令
发布自己的镜像
DockerHub
1. 官网注册自己的账号
2. 确定这个账号可以登录
docker login -u 用户名
输入密码进入
3. 在我们服务器上提交自己的镜像
docker push taohy/
4. 登录完就可以提交镜像
登录账号:
在阿里云发布镜像
- 登录阿里云
- 找到容器镜像服务
- 创建命名空间
- 创建容器镜像
新建阿里云镜像仓库地址: - 浏览镜像仓库信息
小结
Docker网络
网络详解
# 进入容器
PS C:\Users\taohy> docker exec -it 98da3ab14625 /bin/bash
# 查看容器的内部网络IP地址 172.17.0.3
root@98da3ab14625:/usr/local/bin/ignition# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 16 bytes 1072 (1.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9 bytes 602 (602.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 1394 bytes 354097 (354.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1394 bytes 354097 (354.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 再启动一个容器,查看ip地址 172.17.0.2
root@801e60036d61:/usr/local/bin/ignition# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 472 bytes 373438 (373.4 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 430 bytes 33381 (33.3 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 708 bytes 173243 (173.2 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 708 bytes 173243 (173.2 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 思考,外机能否ping通主机容器内部?
Linux能ping通
winodws不能ping通
# 容器如何访问到Windows?
容器访问外机,默认的要用host.docker.internal
# 容器之间能互相通吗? 可以通 容器内:172.17.0.2 ping 172.17.0.3
root@801e60036d61:/usr/local/bin/ignition# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.051 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.037 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.052 ms
# 查看网络命令 docker network --help
PS C:\Users\taohy> docker network ls
NETWORK ID NAME DRIVER SCOPE
075fff009f22 bridge bridge local
efbaf94573b8 host host local
29125732f2e0 none null local
# 查看网络具体信息
docker network inspect 075fff009f22
# inspect 是查看具体信息,非常有用,不管是查看容器内部还是容器网络
docker inspect 容器ID
docker network inspect 网络ID
自定义网络
查看所有的docker网络
PS C:\Users\taohy> docker network ls
NETWORK ID NAME DRIVER SCOPE
075fff009f22 bridge bridge local
efbaf94573b8 host host local
29125732f2e0 none null local
网络模式
bridge :桥接 docker(默认,如果自己创建也用bridge)
none:不配置网络(用的少)
host:和主机共享网络
container:容器网络连接(用的少)
网络测试
# 创建自定义的网络bridge:
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
# 创建之后查看网络,mynet
PS C:\Users\taohy> docker network ls
NETWORK ID NAME DRIVER SCOPE
075fff009f22 bridge bridge local
efbaf94573b8 host host local
6c3a287738b3 mynet bridge local
29125732f2e0 none null local
# 启动容器放在自定义网络 --net
docker run -d -P --name tomcat-net-01 --net mynet tomcat
网络连通
容器连接到一个网络:
结论:
假设要跨网络操作别人,就需要使用docker network connect 连通!
- 点赞
- 收藏
- 关注作者
评论(0)