目录
镜像
介绍
镜像是Docker的三大核心概念之一。
Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以用过配置,使用自定义的镜像仓库。
Docker环境信息 info、version
镜像仓库命令 login、logout、pull、push、search
镜像管理 build、images、rmi、save、tag、commit、import、load
容器生命周期管理 create、exec、kill、pause、restart、rm、run、start、stop、unpause
容器运维操作 attach、export、inspect、port、ps、rename、stats、top、wait、cp、diff、update
容器资源管理 volume、network
系统信息日志 events、history、logs
1.events打印容器的实时系统事件
2.history 打印出指定镜像的历史版本信息
3.logs打印容器中进程的运行日志
获取镜像
docker pull --help
查询本地镜像
docker images --help
使用docker images 可以看到本地的镜像列表:
删除镜像
docker rmi --help
删除镜像通过命令docker rmi 镜像id完成,需要注意的是,删除镜像前,要删除所有使用到该镜像的容器。
-f参数是强制删除,如果有正在运行的容器使用了该镜像,那么该镜像是不会真正的删除的。
导入导出操作
save命令将镜像保存为tar文件。
docker save -o images.tar postgres:9.6
load命令将tar文件加载到本地镜像中。
docker load -i images.tar
搜索镜像
docker search --help
刚刚我们是通过网页进行搜索,其实用过docker的命令也可以搜索,具体如下:
镜像加速
当你拉去docker官方仓库镜像是发现经常超时,这个时候需要使用加速器。
阿里云仓库
1.获取阿里云加速器
2.在linux中执行
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://0qkswp0o.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
容器
介绍
容器是Docker的另一个核心概念
简单的说,容器是镜像的一个运行实例,所不同的是它带有额外的可写文件层。
如果认为虚拟机是模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个或一组应用,以及它们的必须运行环境。
查看容器列表
docker ps --help
创建容器
docker create --help
通过docker create 命令可以创建一个容器,这仅仅是创建,并没有启动容器。
启动/停止
启动
docker start 容器名或容器id
停止
docker stop 容器名或容器id
或
docker kill 容器名或容器id
创建并且运行容器
docker run -p 16381:6379 --name redis2 redis:6
发现,这个容器已经创建并且运行,但是,它并没有在后台运行,当按下 control + c时,该容器将停止。
为了让容器在后台运行,需要添加参数 -d。
docker run -p 16380:6379 -d --name redis2 redis:6
删除容器
docker rm 容器名或容器id
通过命令docker rm 删除容器,删除正在运行的容器添加 -f 参数。
进入容器
docker exec -it 容器名或id
注:control + d 退出容器。
如:进入redis容器
docker exec -it redis /bin/bash
查看日志
docker logs -f 容器名或id
仓库
创建仓库
阿里云既提供了加速功能,也提供了仓库功能,也就是我们可以将自己的镜像上传到阿里云仓库。
- 创建命名空间
- 创建镜像
创建完成后就可以上传镜像到该仓库了。
推送镜像
1.docker登录阿里云
sudo docker login --username=gongzhen1175533636@163.com registry.cn-hangzhou.aliyuncs.com
2.给镜像打包
docker tag redis:6 registry.cn-hangzhou.aliyuncs.com/test_gz/redis:6
3.推送镜像到阿里云
docker push registry.cn-hangzhou.aliyuncs.com/test_gz/redis:6
4.查看版本
5.删除本地镜像,重新拉取
容器网络
docker提供了三个开箱即用的网络模式(驱动)bridge、host 和none
一、bridge模式
docker的默认模式,docker进程第一次启动会创建一个docker0虚拟网桥,
此宿主机上启动的容器会默认连接到这个网桥上,容器通过这块网桥NAT访问外部网络,
当执行docker run 加入-p参数是,实际是在iptables中加入了对应的DNAT端口转发规则。
二、host模式
host模式的容器跟宿主机共用一个namespace,拥有一样的IP和路由,因此容器内的服务端口不能跟宿主机相同;
host模式主要用于对网络性能要求高、追求传输效率的服务,但是需要注意的是会占用主机的端口,多个容器工作可能需要处理冲突。
三、none模式
none模式创建的容器没有添加网卡,需要自行配置。
birdge模式
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机时不可见的,容器通过宿主机的NAT规则后访问外网
可以看到这个容器的ip与桥接接口在一个网段,并且ip地址以网桥ip为基础递增,以网桥ip为网关
bridge是docker默认网络模式,docker安装后会选择一个私有网段作为bridge的子网,从下面config中可以看到我们的16位掩码的子网是172.17.0.0/16,这样在我们创建容器时默认会将容器网络加入到这个子网中。
[root@10 ~]# docker inspect bridge
[
{
"Name": "bridge",
"Id": "41a7d734becc3655de361f598339ca8a355bc2107d8600af642a29ad85134567",
"Created": "2021-12-18T12:34:25.570861489Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"dad24a664a24fdae23c536b5aed18855820434b74084cc88d0be12c37e89dc6d": {
"Name": "nginx",
"EndpointID": "9e8f254709a6d2eccfa132fb17418e7b803ab4d783f2257735010d2971323140",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
host模式
host模式可以让容器共享宿主机网络栈,这样的好处时外部与容器直接进行通信,但是容器的网络缺少隔离性。
测试:
在真机上可以访问到宿主机的ip,看到nginx服务的默认页面,其实访问的是容器,因为容器的ip与宿主机的ip一模一样
[root@10 ~]# docker pull nginx
# 指定网络模式为host
[root@10 ~]# docker run -d --name nginx1 --network=host nginx:latest
# 请求宿主机地址,nginx默认开启80端口,所以会打印nginx
[root@10 ~]# curl 192.168.56.71
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
常用命令
不指定网络驱动时默认创建的bridge网络
docker network create default_network
列所有列表的网络
docker network ls
查看网络内部信息
docker network inspect default_network
移除指定的网络
docker network rm default_network
完整
# --dirver、--subnet、--gateway分别指定我们的驱动、子网和网关
docker network create --driver bridge --subnet 172.0.0.0/24 --gateway 172.0.0.1 newbridge
数据卷
docker在容器中管理数据主要有两种方式:
- 挂载主机目录(Bind mounts)
- 数据卷(Volumes)
挂载
docker run -it -v /宿主机目录:/docker目录 --name nginx nginx:laster
-v:宿主机目录:docker目录 (必须为绝对路径)
数据卷常用命令
创建数据卷
docker volume create mydata
查看所有数据卷
docker volume ls
查看数据卷信息
docker volume inspect mydata
删除数据卷
docker volume rm mydata
问题
常用参数
-e 环境 -e MYSQL_ROOT_PASSWORD=root 对应dockerfile的ENV
-d 后台运行
-v 挂载 -v /data/redis/data:/data>
–name 容器的名称
-p 端口映射 -p 8080:8080
–build-arg:参数,对用dockerfile中的ARG
–link: 可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信
–link的格式: --link :alias
例子:
源容器: docker run -d --name node1 node1:laster
接收容器: docker run -d --name node2 --link node1:aliasNode1 node2:laster
node1作为源容器,aliasNode1是该容器在link下的别名(alias),通俗易懂的讲,站在node2容器的角度,node1和aliasNode1作为源容器的hostname,node2可以通过node1和aliasNode1访问。
开机启动
docker update nginx --restart=always
解决docker容器内没有ip addr | ifconfig | ping命令
apt-get update
apt install net-tools # ifconfig
apt install iputils-ping # ping