服务计算:docker与应用容器化

docker简介

  • Docker是什么?
    Docker的中文本意是码头工人,用于搬运货柜。Docker官网给出的解释是Docker是世界领先的软件货柜运输平台。通俗来说就是Docker就是一个可以将软件打包在一个标准的“货柜”里,并可以轻松迁移的平台。
  • Docker有什么作用?
    Docker容器打包软件到一个包含了所有运行所需环境(代码、运行时状态、系统工具、系统库——任何可以被安装在服务器上的环境)的文件系统里,这样软件无论被迁移到哪里都是同样的运行环境。
    通俗来说就是开发环境如果没有问题,用Docker打包成容器在服务器上运行,至少不会遇到环境问题。
    还有像我这样使用Mac开发的程序员,如果需要开发oracle数据库,本地是无法安装oracle的,可以通过docker运行一个oracle镜像。
  • Docker的特点
  1. 轻量性
    运行在一台机器上的容器共享其操作系统内核,它们启动使用更少的内存。Docker的镜像文件可以通过分层的文件系统及共享的公共文件创建(说白了就是Docker的镜像文件可以在其他镜像基础上创建并且还可以共享使用其他镜像或操作系统的文件,这样镜像文件就很小),节省磁盘空间并提高下载效率。
  2. 开放性
    Docker容器基于开放标准,使容器能够在所有的主流Linux及windows或者其他设备的顶层运行。
  3. 默认安全性
    容器隔离彼此和基础架构应用,同时为应用程序提供了额外的保护层。

docker安装

  1. CentOS系统内核版本需要高于3.10。如低于3.10,需升级内核。
  • 升级内核
    1、导入key
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org  
    
    2、安装elrepo的yum源
    rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm  
    
    3、安装内核
    yum --enablerepo=elrepo-kernel install  kernel-ml-devel kernel-ml  
    
    4、查看默认启动顺序
    awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg  
    CentOS Linux (4.4.4-1.el7.elrepo.x86_64) 7 (Core)  
    CentOS Linux (3.10.0-327.10.1.el7.x86_64) 7 (Core)  
    CentOS Linux (0-rescue-c52097a1078c403da03b8eddeac5080b) 7 (Core)
    
    默认启动的顺序是从0开始,新内核是从头插入(目前位置在0,而4.4.4的是在1),所以需要选择0。
    grub2-set-default 0  
    
    然后reboot重启,使用新的内核,下面是重启后使用的内核版本:
    uname -r  
    4.4.4-1.el7.elrepo.x86_64  
    
    5、删除旧的内核
    yum remove kernel  
    
  1. 卸载之前安装过docker
yum -y remove docker docker-common docker-selinux docker-engine docker-engine-selinux container-selinux docker-ce

# 或者
yum -y remove docker*

#删除所有的镜像、容器、数据卷、配置文件等
sudo rm -rf /var/lib/docker

# 查看安装的docker相关软件 卸载情况
yum list installed | grep docker
  1. 用国内阿里云安装
# Set up repository
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# Use Aliyun Docker
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


# 查看指定版本

yum list docker-ce --showduplicates

# 安装指定版本

yum install -y --setopt=obsoletes=0 \
   docker-ce-17.03.2.ce-1.el7.centos.x86_64 \
   docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch
   
   
# 不指定版本号 默认安装最新版
sudo yum install docker-ce
  1. 设置文件系统
vim /etc/systemd/system/docker.service.d/override.conf

[Service]
ExecStart=
#ExecStart=/usr/bin/docker daemon  -H fd:// --insecure-registry hub.03in.com:5002
ExecStart=/usr/bin/dockerd -s overlay2  --insecure-registry hub.03in.com:5002
  1. cnetos 用 overlay 文件系统 处理d_type 警告
  • 启用一个新的磁盘 格式化为 xfs 或者 ext4
  mkfs.ext4 /path/to/your/device # ext4 方式
  
  mkfs.xfs -n ftype=1 /path/to/your/device #注意这里带了 ftype=1
  
  # 例如我的机器
  mkfs.xfs -n ftype=1 /dev/vdc
  # 挂载磁盘到目录(临时 挂机后可能会消失)
  mount /dev/vdc /data
  # 开启挂载 写入 /etc/fstab
  vim /etc/fstab
  添加 
  /dev/vdc  /data                  xfs    defaults        1   2
  • 转移docker 默认安装路径到新的路径下
# stop docker
service  docker stop

# 移动docker目录到新的位置

mv /var/lib/docker  /data/docker

# 在原来的位置创建软链接

ln -s /data/docker /var/lib/dockr

# 重启docker

service docker start

# docker info 查看 d_type 已经为true Ok 
# 查看docker info
 Storage Driver: overlay
 Backing Filesystem: xfs
 Supports d_type: true

#查下新磁盘支持 ftype
xfs_info /data
meta-data=/dev/vdc               isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1  #1 支持了
  1. 启动
# Start docker service
systemctl enable docker
systemctl start docker


# 重新加载设置  重启引擎
systemctl daemon-reload
systemctl restart docker

docker基本操作

  • 检查docker 安装
$ docker version
  • 运行镜像
~]# 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:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
~]# docker run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
32802c0cfa4d: Pull complete
da1315cffa03: Pull complete
fa83472a3562: Pull complete
f85999a86bef: Pull complete
Digest: sha256:6d0e0c26489e33f5a6f0020edface2727db9489744ecc9b4f50c7fa671f23c49
Status: Downloaded newer image for ubuntu:latest
root@e2442527555f:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr
root@e2442527555f:/# exit
exit
[root@centos-docker-ex ~]#
  • 显示本地镜像库内容
~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 93fd78260bd1 2 weeks ago 86.2 MB
hello-world latest 4ab4c602aa5e 3 months ago 1.84 kB
  • 获得帮助
~]# docker --help

– 基本选项
– 管理命令(至少掌握container,image,network,volume)
– 常用命令
• 例如:docker images 等价于docker image ls
• 例如:docker ps 等价于docker container ls

  • 显示运行中容器
~]# docker ps
CONTAINER ID IMAGE COMMAND …
  • 显示所有容器(包含已中止)
~]# docker ps -a
CONTAINER ID IMAGE COMMAND STATUS NAMES
e2442527555f ubuntu "bash" Exited (0) frosty_goodall
627aa20c5232 hello-world "/hello" Exited (0) heuristic_franklin
  • 继续运行原容器并进入
~]# docker restart frosty_goodall
~]# docker ps
~]# docker attach frosty_goodall
root@e2442527555f:/# exit
  • 启动nginx镜像,没有会自动pull
# docker run -d --name mynginx nginx   
  • 停止一个容器,根据容器 id 进行删除
$ docker stop bfd094233f96   
  • 删除一个容器
$ docker rm bfd094233f96   
  • 进入一个正在运行的容器
$ docker attach d20f3dc6cd92  

-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开。
-name 使用一个自定义的名字

  • 建议使用以下命令进入容器:
$ docker inspect --format "{{.State.Pid}}" mynginx  #获取容器pid 19769
$ nsenter --target 19769 --mount --uts --ipc --net --pid  #进入容器(推荐方法)
$ docker run -d -p 91:80 --name mynginx2 nginx    # -p 指定端口映射,将80映射为host的91
  • 存储镜像:
# docker save -o ubuntu_14.04.tar ubuntu:14.04
  • 载入镜像:
# docker load < ubuntu_14.04.tar  或者使用 
# cat ubuntu.tar |  docker import - test/ubuntu:v1.0
  • 移除本地镜像:
# docker rmi training/sinatra
  • 清理所有未打过标签的本地镜像:
# docker rmi $(docker images -q -f "dangling=true")

其中 -q-f-quiet-filter 的缩写, 完整的命令其实可以写着下面这样:

# docker rmi $(docker images --quiet --filter "dangling=true")

注: 容器是否会长久运行,是和docker run指定的命令有关,和 -d 参数无关。

MySQL与容器化

  • 拉取MySQL 镜像
~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a5a6f2f73cd8: Downloading 16.97 MB/22.49 MB
… …
~]# docker images

– Repository: mysql
– Tag: 5.7
– Image ID: ae6b78bedf88

  • 远程仓库
    – 官方仓库: https://hub.docker.com/_/mysql/
    – 格式:https://registry/user/repo
    – 仓库中保存若干版本镜像,每个镜像对应一个tag,默认的tag 是lastest
    – 每个镜像有github 上Dockfile 生成

  • MySQL 容器构建文件Dockerfile
    https://github.com/docker-library/mysql/blob/master/5.7/Dockerfile

  • Dockerfile 常见指令(按指令出现顺序)
    – FROM base_image
    – RUN shell_commands
    – ENV env_vars
    – VOLUME path
    – COPY source destination
    – ENTRYPOINT [“executable”,”parm1”, ”parm2”,…]
    – EXPOSE ports
    – CMD [“executable”,”parm1”, ”parm2”,…]

  • Docker compose 与多容器应用自动化部署
    – 下载:docker-compose(容器编排的原型)
    – 编写:stack.yml
    – 启动服务

~]# mkdir comptest && cd comptest
comptest]# vi stack.yml
version: '3.1'
services:
db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
adminer:
image: adminer
restart: always
ports:
- 8080:8080
comptest]# docker-compose -f stack.yml up
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值