登录后台

页面导航

本文编写于 187 天前,最后修改于 179 天前,其中某些信息可能已经过时。

安装

下载docker-ce(docker社区版)的yum源

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y

Docker配置镜像加速(登录阿里云)

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://kwutlccp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

查看docker版本

docker version
docker info #查看dock的一些配置参数(docker root dir #docker文件放置的目录)
也可以查看docker运行了几个容器,几个镜像,挂起了几个等等
/var/lib/docker #docker的镜像和容器等文件都存在这个目录

镜像

镜像的基本操作。搜索、下载、查看、导入、导出、删除、上传。

搜索镜像

docker search xxx

下载镜像

docker pull centos:7.5.1810 #下载镜像要跟上后面版本,否则默认下载最新版

查看镜像列表

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7.8.2003            afb6fca791e0        2 months ago        203MB
hello-world         latest              bf756fb1ae65        6 months ago        13.3kB

删除镜像,若出现镜像被容器正在使用,可以增加-f参数,强制删除

docker image rmi hello-world:latest #后面跟名称+TAG  或者后面跟 IMAGE ID 也可以
docker image rmi -f  #强制删除

备份镜像

docker save centos:7.5.1810 > /opt/centos.tar.gz #将镜像保存成一个tar包
du -sh /opt/centos.tar.gz #查看tar包大小

恢复镜像

docker load < /opt/centos.tar.gz #恢复镜像

容器

容器是镜像运行的一个实例,就像虚拟机程序运行了一台虚拟机

启动一个容器

docker run -it centos:7.8.2003 /bin/bash 
#-i表示启动一个可交互的容器,并且持续打开标准输入
#-t表示使用终端关联到容器的标准输入输出上
#COMMOND 表示运行该镜像需要执行的命令

运行一个容器,并给他命名

docker run --name=test centos:7.8.2003 echo "cnm" #此时docker ps -a即可看到自己命名的容器

后台运行一个容器

docker run -itd centos:7.8.2003 /bin/bash 

清理容器

docker kill 14b79474e0f1  #关掉某一个进程
docker ps -a -q #查看所有容器的id
docker rm $(docker ps -a -q)批量删除所有进程
docker rm -v $(docker ps -a -q)批量删除所有进程的同时,删除容器的卷

运行完一个容器后,自动关闭进程(即docker ps -a看不到该进程)

docker run --rm centos:7.8.2003 echo "cnm"

启动|停止|重启一个容器

docker start 1b1199086de1
docker stop 1b1199086de1
docker restart 1b1199086de1

进入一个已经启动的容器

docker exec -it 14b79474e0f1 /bin/bash

容器暴露(将宿主机端口映射到docker容器,使容器能够被访问)

docker run -d -p 8888:80 nginx #将宿主机8888端口映射到容器的80端口
-p hostip:hostport:containerPort #指定宿主机ip和端口映射到容器的端口
-p hostip::containerPort #指定宿主机ip并随机使用一个宿主机端口映射到容器
-P #随机端口映射到容器ip

容器的整个生命周期

以centos为例
  1. Docker会去获取centos的镜像,检查本地是否存在,如果存在则使用,如果不存在则上默认的远程仓库去拉取该镜像
  2. Docker通过centos的镜像去创建一个新的容器,并在镜像的文件系统之上添加一层“可读写”的层来运行应用程序
  3. Docker会通过网桥设备,为容器划分一个ip地址,并挂载至容器中
  4. Docker会执行启动的命令,比如/bin/bash表示启动一个和本地交互的进程
  5. 执行完毕后的容器会自动退出,除非让我们的进程一直处于RUNNING状态(加-d),则容器不会退出。

数据持久化(容器删除后,数据依然能被存储下来)

data volume(通常数据库使用,由docker去管理)

将容器中的某个目录持久化到宿主机的某个目录

docker run -d --name mysql3 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v mysql3:/var/lib/mysql mysql
# --name 容器别名
#-e 跟一个环境变量
#-v volume别名:宿主机目录
docker volume ls #查看所有卷
docker volume inspect 卷名 #查看该卷详细信息
docker volume rm 卷名 #删除卷
docker volume prune #清理无主的数据卷,该类数据卷可能会占用大量资源

当容器mysql3被删除,我再起一个容器mysql4,并调用mysql3的volume即可把容器mysql3的数据恢复出来

docker stop mysql3
docker rm mysql3
docker run -d --name mysql4 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes -v mysql3:/var/lib/mysql mysqll
#新起一个mysql4容器使用mysql3的volume数据

BindMount文件挂载(自己管理)指定容器的目录直接去读宿主机的某个目录

nginx场景为例

mkdir /www
cd /www
vim index.html
docker run -d -p:8888:80 -v /www:/usr/share/nginx/html nginx #这样访问nginx时,会直接去读宿主机/www下的index文件

Docker网络模式(bridge,host,container,none)

bridge模式

相当于vmware中的桥接模式,默认开一个容器就是使用该模式

dockr network create -d bridge mynet
docker run -it --name net01 --network mynet alpine /bin/bash
#先创建一个bridge mynet,然后再这个mynet下面创建容器,相当于vmware中的桥接模式

host模式

相当于vmware中的仅主机模式,与宿主机共享ip和网卡

docker run -itd --network=host nginx
docker run -itd --network=host redis
#nginx和redis共享宿主机的ip

contain模式

多个容器使用同一个ip,容器与容器之间用127.0.0.1互相通信。该模式最为常用,在容器编排中广泛应用,非常重要

docker run -d -p80:80 -p6379:6379 --name db redis
docker run -d --name python-web --network=container:db python-web:v1
#启动一个db容器,并把需要的端口都映射好
#启动redis容器,并使用db容器的ip地址,两个容器使用同一个ip(容器db的ip)且都能访问到
#通过docker inspect redis查看redis容器的ip,发现他没有ip,因为默认使用的是容器db的ip

none模式(很少使用)

启动一个容器,且该容器没有ip,该容器不跟外界通信时使用。

docker run -it --network=none alpine /bin/sh
/ # ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # 
#可见该容器是没有ip的