一、Docker简介
-
Docker三要素:
-
镜像:类似于面向对象中,类
-
容器:类似于面向对象中,类的实例对象,容器包含Linux最小核心运行需要的最小内核文件
-
仓库:类似于github,存放管理docker镜像的地方
-
-
CentOS上安装Docker
-
# 卸载旧版docker # 安装仓库管理yum-utils $ sudo yum install -y yum-utils # 添加docker仓库(添加国内阿里云仓库) $ yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新yum软件包索引 $ yum makecache timer #安装docker $ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动docker服务(守护进程形式) $ sudo systemctl start docker # 运行hello world $ sudo docker run hello-world
二、Docker基本操作指令
1、启动指令
-
systemctl
$ systemctl start/stop/restart/status/enable docker # 启动/停止/重启/查看状态/开机启动
2、对镜像的操作
-
docker images
$ docker images # 查看当前所有镜像 $ docker images -a # 查看本地所以普镜像(包含历史镜像) $ docker images -q # 查看镜像的id $ docker images -qa # 查看所有id
-
docker search
$ docker search 镜像 $ docker search --limit 5 镜像 # 列出5条包含镜像名的镜像
-
docker pulldo
$ docker pull 镜像[:TAG] # 无版本号,默认最新;指定tag,下载指定版本 $ docker pull 镜像:latest == docker 镜像
-
docker system df
$ docker system df #查看docker所有镜像的占用空间
-
docker rmi
$ docker rmi 镜像1:TAG 镜像2:TAG ... # 删除没有加载到容器的镜像 $ docker rmi -f # 强制删除镜像(即使被使用) $ docker rmi -f $(docker images -qa) # 删除所有镜像
-
虚悬镜像:仓库名和id都是 <none>的镜像,但是却占用了空间
3、对容器的命令
-
docker run
-
前台守护进程 -d: 适用于redis等数据库
-
后台交互式-it:适用于web服务进程(若对web服务进程用-d启动,会由于没有前台任务,而自杀)
-
$ docker run -d 镜像 # 启动容器,运行镜像(后台守护进程形式,如果改用-it,当按键ctrl+p+q会退出redis,所以需要守护进程形式) $ docker run -it 镜像 # 启动交互式容器,返回一个终端(前台命令行,如果改用-d,当docker前台没有进程的话,会立刻自杀) # 在终端中,exit 停止运行容器 # 如果按ctrl+p+q 退出这个终端,但容器不停止运行
-
docker ps
$ docker ps # 显示所有正在运行的容器 $ docker ps -a # 显示历史容器信息(类似于 history) $ docker ps -l # 显示最近一个容器 $ docker ps -n 5 # 显示最近5个容器 $ docker ps -q[a,n,l] # 显示容器id $ docker ps -q -a
-
对容器id的操作
$ docker start 容器id $ docker restart 容器id $ docker stop 容器id $ docker kill 容器id # 强制停止 $ docker logs 容器id # 查看容器的执行日志 $ docker top 容器id # 查看容器的进程信息 $ docker inspect 容器id # 查看容器的详细信息 # 退出容器后,重新进入容器 docker attach 容器id # 进入容器,用exit退出会停止容器的运行 docker exec --it 容器id bash # 进入容器,用exit退出不会停止容器运行
-
docker rm
$ docker rm 容器id # 删除已停止的容器 $ docker rm -f 容器id # 强制删除容器 $ docker rm -f $(docker ps -q -a) # 删除所有容器 $ docker rm -f
-
在容器和本地主机之间拷贝资料
$ docker cp 容器id:源文件地址 目的地址 # 从容器拷贝到本地主机 $ docker cp 源文件 容器id:目的地址 # 从
4、Docker文件系统
-
Docker文件系统时联合分层文件系统,镜像层包含多层,比如bootfs,rootfs,和应用层;
-
Docker镜像实例化为容器,运行容器时,先启动bootfs(Docker的Linux系统使用宿主主机的bootfs,仅加载runtime环境,所以特别小),引导系统,加载rootfs,然后是各层的应用,Docker的容器实例会在所有镜像层的最外面加一层实例层,镜像层全部是只读的,容器层可修改
5、镜像制作、pull、push
$ docker commit -m="描述" -a="作者" 要打包的容器ID 镜像名(取名):TAG # 运行就用镜像id $ docker run -it 镜像id bash
6、Docker公有仓库、私有仓库
-
公有仓库参考阿里云镜像仓库
-
可以配置阿里云镜像仓库加速器,加速下载
-
$ sudo mkdir -p /etc/docker $ sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://88fynflq.mirror.aliyuncs.com"] } EOF $ sudo systemctl daemon-reload $ sudo systemctl restart docker
-
私有仓库
-
下载镜像Dcoker Registry,运行一个私有仓库容器
$ docker pull registry # 拉去管理私有仓库的工具 $ docker run -d -p 5000:5000 -v /xhbb/myregistry/:/tmp/registry --privileged=true registry # 运行私有仓库,把端口映射到dcoker私有仓库端口上
-
创建新镜像
$ docker run -it ubuntu bash # 运行一个容器实例 (在ubuntu中安装ifconfig: apt-get update; apt-get install net-tools;) # 对容器添加新的功能 $ docker commit -m="描述" -a="作者信息" 容器ID 镜像名:TAG # 打包容器成为镜像
-
curl查询私服库上的镜像
# 私有仓库默认是使用https保护安全的,所以需要在/etc/docker/daemon.json(参考阿里云镜像仓库加速)中设置,添加以下键值 "insecure_registries": "[127.0.0.1:5000/xhbb]" # 随后可以重启docker确保更改生效,重启后同时要运行刚才建立的私服库容器 $ systemctl restart docker $ docker start 私服库容器ID # 可以根据docker ps -a查询 # 查询私有仓库上的镜像 $ curl -XGET http://私有仓库IP:端口/v2/_catalog
-
为镜像设置标签TAG,把镜像设置成私有库所有,否则无法上传
$ docker tag 镜像:TAG 私有仓库IP:端口/镜像名(自取):TAG
-
把新镜像push到私服仓库
$ docker push 私有仓库IP:端口/改名后的镜像:TAG
-
pull、delete删除私服库的镜像
# pull到本地 $ docker pull 私有仓库IP:端口/镜像 # delete私服库的镜像,进入私服库容器的存储位置 $ docker exec <容器名> rm -rf /var/lib/registry/docker/registry/v2/repositories/<镜像名>
-
7、Docker容器数据卷
-
利用数据卷,宿主主机和容器,实现文件夹映射,在任意一个文件夹的操作会同步到另一个文件夹,实现数据的同步和持久化:
(1)数据卷可以在数据之间共享和数据重用; (2)数据卷的更改可以实时生效; (3)数据卷中的更改不会包含在镜像的更新中; (4)数据卷的生命周期一直持续到没有容器使用它为止。
-
数据卷挂载
$ docker run -it --privileged=true -v 宿主主机文件夹:容器文件夹 容器id:[options] --name 别名 镜像 bashShell命令 [options]: ro:代表容器内该文件夹只读,宿主主机内文件夹可写可读,也会同步到容器文件夹; rw:就是容器文件夹可写可读 bashShell命令: bash、/bin/bash:打开一个bash终端
-
数据卷继承和共享:从父容器继承数据卷挂载,并且所有的挂载的文件夹(比如现在是3个:宿主、父容器、子容器)中对文件的操作全是同步的
$ docker run -it --privileged=true -volumes-from 父容器 宿主主机文件夹:容器文件夹 容器id:[options] --name 别名 镜像 bashShell命令 [options]: ro:代表容器内该文件夹只读,宿主主机内文件夹可写可读,也会同步到容器文件夹; rw:就是容器文件夹可写可读 bashShell命令: bash、/bin/bash:打开一个bash终端
-