Centos7 docker docker-compose安装及镜像部署常用操作

使用 yum 安装(CentOS 7下)

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。

通过uname -r命令查看你当前的内核版本

[root@runoob ~]# uname -r 

安装 Docker

从 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

Centos7 docker docker-compose安装及镜像部署常用操作_第1张图片

由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。

使用脚本安装 Docker

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

执行以下命令来删除 Docker CE:

$ sudo yum remove docker-ce
$ sudo rm -rf /var/lib/docker

Docker容器使用问题:Failed to get D-Bus connection: Operation not permitted

刚开始接触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内核,也就是没有特权,所以自然就用不了!

因此,请遵守容器设计原则,一个容器里运行一个前台服务!

我就想这样运行,难道解决不了吗?

答:可以,以特权模式运行容器。

创建容器:

# docker run -dit --privileged -p 8080:80 centos /usr/sbin/init

进入容器:

# docker exec -it centos /bin/bash

这样可以使用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

你可能感兴趣的:(linux,docker,centos)