Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过uname -r命令查看你当前的内核版本
[root@runoob ~]# uname -r
从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。
Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
本文介绍 Docker CE 的安装使用。
移除旧的版本:
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务
sudo systemctl start docker
测试运行 hello-world
[root@runoob ~]# docker run hello-world
由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
1、使用 sudo
或 root
权限登录 Centos。
2、确保 yum 包更新到最新。
$ sudo yum update
3、执行 Docker 安装脚本。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
执行这个脚本会添加 docker.repo
源并安装 Docker。
4、启动 Docker 进程。
sudo systemctl start docker
5、验证 docker
是否安装成功并在容器中执行一个测试的镜像。
$ sudo docker run hello-world
docker ps
到此,Docker 在 CentOS 系统的安装完成。
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
或
{
"registry-mirrors": ["https://hub.daocloud.io"]
}
{
"registry-mirrors": ["https://1azkbwh7.mirror.aliyuncs.com"]
}
执行以下命令来删除 Docker CE:
$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker
刚开始接触Docker的朋友,可能会遇到这么一个问题,使用centos7镜像创建容器后,在里面使用systemctl启动服务报错。针对这个报错,我们接下来就分析下!
# docker run -itd --name centos7 centos:7
# docker attach centos7
# yum install vsftpd
# systemctl start vsftpd
Failed to get D-Bus connection: Operation not permitted
不能启动服务,什么情况?
难道容器不能运行服务嘛!!!
Docker的设计理念是在容器里面不运行后台服务,容器本身就是宿主机上的一个独立的主进程,也可以间接的理解为就是容器里运行服务的应用进程。一个容器的生命周期是围绕这个主进程存在的,所以正确的使用容器方法是将里面的服务运行在前台。
再说到systemd,这个套件已经成为主流Linux发行版(比如CentOS7、Ubuntu14+)默认的服务管理,取代了传统的SystemV风格服务管理。systemd维护系统服务程序,它需要特权去会访问Linux内核。而容器并不是一个完整的操作系统,只有一个文件系统,而且默认启动只是普通用户这样的权限访问Linux内核,也就是没有特权,所以自然就用不了!
因此,请遵守容器设计原则,一个容器里运行一个前台服务!
我就想这样运行,难道解决不了吗?
答:可以,以特权模式运行容器。
创建容器:
进入容器:
这样可以使用systemctl启动服务了。
本地文件上传至docker容器
docker cp 本地文件路径 ID全称:容器路径
docker cp /root/jdk-8u221-linux-x64.tar.gz 694fbffc7687:/usr/java
后台运行镜像
docker run -dit -p 80:80 [CONTAINER_NAME or CONTAINER_ID] /bin/bash
搜索镜像
docker search centos
查看所有容器
docker ps -a
停止容器运行
docker stop {containerID}
删除容器(-f强制删除,正在运行的容器也删除)
docker rm -f {containerID}
删除镜像(-f强制删除,否则需先停止容器运行才能删除镜像)
docker rmi -f hello
镜像打tag(可以用这种方法更新tag)
docker tag hello hello:1.0.0
查看指定镜像
docker images |grep hello
查看指定进程
docker ps | grep hello
将镜像push到镜像仓库
docker push xx.xx.xx.xx/hello
进入正在运行的容器执行指令(exec命令进入容器再退出后,容器不会停止;attach进入容器再退出后,容器停止)
docker exec -it 0e6d50eb1469(container ID) /bin/bash
docker attach 0e6d50eb1469(container ID)
退出容器
exit / ctrl + c
根据容器的状态,删除exited状态的容器
sudo docker rm $(sudo docker ps -qf status=exited)
退出容器伪终端
按顺序依次ctrl+p,ctrl+q(退出终端不关闭容器)
exit或ctrl+d(退出终端并关闭容器)
CMD
支持三种格式
CMD ["executable","param1","param2"] 使用 exec 执行,推荐方式;
CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用;
CMD ["param1","param2"] 提供给 ENTRYPOINT 的默认参数;
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条命令,只有最后一条会被执行。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
ENTRYPOINT
两种格式:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2(shell中执行)。
配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
在容器执行脚本时,注意。当前容器本身是主进程,start.sh的操作是守护进程,必须保证最后一个守护进程处于前台运行状态,否则容器会在执行脚本完成会自动关闭容器,容器停止运行后,所有的脚本里面的进程也随之终止。
之所以出现这种现象,究其原因,一个docker容器同时只能管理一个进程,这个进程退出后,容器也就退出了。这并不意味着一个容器里只能同时运行一个进程(那样太浪费了),只是最后一个运行的进程不能退出。
修改start.sh,保持java命令前台运行,即可避免容器在执行完脚本后exited的情况。start.sh修改如下:
#! /bin/sh
APPNAME=com.xx.xx.rest.Application
java -Xms2048m -Xmx2048m -classpath $CLASSPATH $APPNAME >/dev/null 2>&1
start.sh总结总结:
(1)容器中运行多个守护进程时,前面的进程要用后台方式运行(或添加 &),否则后面的服务无法启动。
(2)容器中最后一个守护进程一定要用前台方式运行,否则start.sh退出,容器退出,所有的服务就白启动了。
二、docker-compose的安装
1、使用国内源安装:
curl -L http://get.daocloud.io/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
查看版本:
docker-compose --version
前台启动:
docker-compose up
后台启动:
docker-compose up -d
下载安装:
https://github.com/docker/compose/releases/download/v2.18.1/docker-compose-linux-x86_64
cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose