使用非Root用户前要增加sudo 命令
旧版本的 Docker 称为 docker 或者 docker-engine,使用以下命令卸载旧版本:
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
执行以下命令安装依赖包:yum install -y yum-utils device-mapper-persistent-data lvm2
鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。
执行下面的命令添加 yum 软件源:
阿里云:
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
163:
yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
官方源
$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
如果需要最新版本的 Docker CE 请使用以下命令:
sudo yum-config-manager --enable docker-ce-edge
sudo yum-config-manager --enable docker-ce-test
更新 yum 软件源缓存,并安装 docker-ce。
yum makecache fast
yum install docker-ce
安装指定版本的Docker:yum list docker-ce --showduplicates | sort -r
yum install docker-ce-18.06.3.ce-3.el7.centos.x86_64
解决方法:
下载container-selinux:wget http://mirrors.atosworldline.com/public/centos/7/extras/x86_64/Packages/container-selinux-2.68-1.el7.noarch.rpm
安装container-selinux(使用–nodeps --force跳过依赖检查):rpm -ivh container-selinux-2.68-1.el7.noarch.rpm --nodeps --force
然后重新安装Docker
systemctl enable docker
systemctl start docker
默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。
建立 docker 组:groupadd docker
将当前用户加入 docker 组:usermod -aG docker $USER
退出当前终端并重新登录,进行如下测试。
# 测试docker是否正确安装
docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
如果在使用过程中发现拉取 Docker 镜像十分缓慢,可以配置 Docker 国内镜像加速。
添加内核参数
如果在 CentOS 使用 Docker CE 看到下面的这些警告信息:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
请添加内核配置参数以启用这些功能。
mkdir -p /etc/docker
tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
然后重新加载 sysctl.conf 即可sysctl -p
编辑文件/etc/docker/daemon.json 添加以下代码:
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
涉及的命令有export、import、save、load
Save 命令 :docker save [options] images [images...]
示例 :docker save -o nginx.tar nginx:latest
或 docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
Load 命令 :docker load [options]
示例 docker load -i nginx.tar
或 docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
Export 命令 :docker export [options] container
示例 docker export -o nginx-test.tar nginx-test
其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)
import命令: docker import [options] file|URL|- [REPOSITORY[:TAG]]
示例 docker import nginx-test.tar nginx:imp
或 cat nginx-test.tar | docker import - nginx:imp
区别
export命令导出的tar文件略小于save命令导出的
export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。如下图所示,nginx:latest是save导出load导入的,nginx:imp是export导出import导入的。
建议:
可以依据具体使用场景来选择命令
若是只想备份images,使用save、load即可
若是在启动容器后,容器内容有变化,需要备份,则使用export、import
docker中删除images的命令是docker rmi,但有时候执行此命令并不能删除images;(确认删除竟像时镜像没有在容器中运行,为停止状态)
docker images 查看镜像
docker rmi IMAGE ID
docker images 重新查看镜像列表
发现image并没有被删除,只是他的tag被删除了,再次执行docker rmi IMAGE_ID只会报错
docker rmi 53912975086f
Error: image_delete: Conflict, 53912975086f wasn't deleted
2019/07/20 16:16:27 Error: failed to remove one or more images
查看docker的帮助会发现有两个与删除有关的命令rm和rmi
rm Remove one or more containers
rmi Remove one or more images
这里有两个不同的单词,images和container。其中images很好理解,跟平常使用的虚拟机的镜像一个意思,相当于一个模版,而container则是images运行时的的状态。docker对于运行过的image都保留一个状态(container),可以使用命令docker ps来查看正在运行的container,对于已经退出的container,则可以使用docker ps -a来查看。 如果你退出了一个container而忘记保存其中的数据,你可以使用docker ps -a来找到对应的运行过的container使用docker commit命令将其保存为image然后运行。
回到之前的问题,由于image被某个container引用(拿来运行),如果不将这个引用的container销毁(删除),那image肯定是不能被删除。
所以想要删除运行过的images必须首先删除它的container。继续来看刚才的例子,
执行命令 docker ps -a
可以看出53912975086f的image被cc6b344ed27f的container使用着,所以必须首先删除该container
docker rm cc6b344ed27f
Error: container_delete: Impossible to remove a running container, please stop it first
2019/07/20 16:36:44 Error: failed to remove one or more containers
现错误,这是因为该container正在运行中(运行docker ps查看),先将其关闭
docker stop cc6b344ed27f
docker rm cc6b344ed27f
docker rmi 53912975086f
docker images