自从加入公司云计算部门,接触的新技术越来越多了,而且客户需求也原来越多样性,做我一名老IT,也必须跟上节奏,接下来一段时间我先尝试去了解docker基本功能,然后深入去挖掘。
一、什么是docker?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:
-
dockerClient客户端
-
Docker Daemon守护进程
-
Docker Image镜像
-
DockerContainer容器
二、如何安装docker
docker支持在主流的操作系统平台上使用,包含Ubuntu、Centos、Windows以及MacOS系统等。当然在linux系统平台上是原生支持,使用体验是最好的。本分享中就以centos为例进行安装
docker支持centos6以及后面的版本
$yum install –y docker
三、镜像
1.获取镜像
docker pull NAME[:TAG] 比如:docker pull Ubuntu
2.查看镜像信息
[root@localhost ~]# docker images;
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 00fd29ccc6f1 32 hours ago 110.5 MB
[root@localhost ~]# docker inspect 00fd29ccc6f1
[
{
"Id": "sha256:00fd29ccc6f167fa991580690a00e844664cb2381c74cd14d539e36ca014f043",
"RepoTags": [
"docker.io/ubuntu:latest"
3.搜索镜像(搜索远端仓库中共享的镜像,默认搜索docker HUB官方仓库中的镜像)
docker search mysql
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/mysql MySQL is a widely used, open-source relati... 5412 [OK]
docker.io docker.io/mariadb MariaDB is a community-developed fork of M... 1676 [OK]
docker.io docker.io/mysql/mysql-server Optimized MySQL Server Docker images. Crea... 373 [OK]
docker.io docker.io/percona Percona Server is a fork of the MySQL rela... 309 [OK]
docker.io docker.io/hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 74
docker.io docker.io/zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 66 [OK]
docker.io docker.io/centurylink/mysql Image containing
4.删除镜像
docker rmi image(image可以为标签或者ID)
docker rmi Ubuntu:latest
dicker rmi –f ubuntu 强行删除,不建议这样操作
一般建议先删除依赖该镜像的所有容器,再来删除镜像。
docker ps -a查看本机上存在的容器。
5.创建镜像
基于已有的镜像的容器创建:
[root@localhost ~]# docker run -ti ubuntu /bin/bash
touch test
exit
docker commit –m “Added a new file” –a “docker Newbee” 8bd2274ada22 test 9ecdbadc
基于本地模板导入
cat ubuntu –14.04-x86_64-minimal.tar.gz |docker import – ubuntu:14.04
6.存出和载入镜像
存出镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 00fd29ccc6f1 2 days ago 110.5 MB
docker.io/httpd latest 7239615c0645 5 days ago 177.3 MB
docker.io/mysql latest 7d83a47ab2d2 5 days ago
[root@localhost ~]# docker save -o ubuntu_test.tar ubuntu
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 00fd29ccc6f1 2 days ago 110.5 MB
docker.io/httpd latest 7239615c0645 5 days ago 177.3 MB
docker.io/mysql latest 7d83a47ab2d2 5 days ago 408.2 MB
[root@localhost ~]# ls
anaconda-ks.cfg ubuntu_test.tar
载入镜像
docker load < ubuntu_test.tar
四、容器
简单地说,容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层。
创建容器:
新建容器:
[root@localhost ~]# docker create -it ubuntu:latest
743f20816538a52a686cf61d6a30db6fdb609c0da2d6a844e645b334b9bb3252
docker start
新建并启动容器
docker run ubuntu /bin/echo “Hello world’
docker ps
: 查看当前运行的容器
docker ps -a
:查看所有容器,包括停止的
docker ps -l
:查看最新创建的容器,只列出最后创建的。
docker ps -n=2
:-n=x选项,会列出最后创建的x个容器。
容器名:docker start docker_run
,或者ID:docker start 43e3fef2266c
。
–restart(自动重启):默认情况下容器是不重启的,–restart标志会检查容器的退出码来决定容器是否重启容器。
docker run --restart=always --name docker_restart -d centos /bin/sh -c "while true;do echo hello world; sleep;done"
:
--restart=always
:不管容器的返回码是什么,都会重启容器。
--restart=on-failure:5
:当容器的返回值是非0时才会重启容器。5是可选的重启次数
容器终止
docker stop [NAME]/[CONTAINER ID]
:将容器退出。
docker kill [NAME]/[CONTAINER ID]
:强制停止一个容器。
删除容器
docker rm [NAME]/[CONTAINER ID]
容器终止后,在需要的时候可以重新启动,确定不需要了,可以进行删除操作。
导入和导出容器
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd7eef06ccba ubuntu "/bin/echo “Hello w" 12 minutes ago Exited (0) 4 minutes ago silly_meitner
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd7eef06ccba ubuntu "/bin/echo “Hello w" 12 minutes ago Exited (0) 4 minutes ago silly_meitner
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dd7eef06ccba ubuntu "/bin/echo “Hello w" 14 minutes ago Exited (0) 7 minutes ago silly_meitner
743f20816538 ubuntu:latest "/bin/bash" 17 minutes ago Created nostalgic_stonebraker
8bd2274ada22 ubuntu "/bin/bash" 31 minutes ago Exited (0) 31 minutes ago sad_mccarthy
7786523990bf ubuntu "/bin/bash" 30 hours ago Exited (0) 30 hours ago awesome_goldstine
175c8cf0149e ubuntu "echo ‘hello! I am he" 30 hours ago Exited (0) 30 hours ago fervent_kowalevski
[root@localhost ~]# docker export dd7eef06ccba > test.tar
cat test.tar |docker import –test/ubuntu
五、仓库
docker 官方维护了一个公共仓库 http://hub.docker.com ,大约15000多个镜像
六、数据管理
用户在使用docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行相应的备份,甚至想把多个容器之间进行数据的共享,这必然涉及容器的数据管理操作。容器中管理数据主要有两种方式:
- 数据卷(Data Volumes)
- 数据卷容器(Data Volume Containers)
在容器内创建一个数据卷
docker run -it --rm --name web -v /src/webapp:/opt/webapp training/webapp python app.py #将宿主机中的/src/webapp目录挂载到容器中的/opt/webapp中
数据容器
- 首先,创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata
- 接着,可以在其它的容器中使用–volumes-from 来挂载dbdata中的/jpzhu_file
利用数据卷容器迁移数据
备份
$ docker run --name worker -v ${pwd}:/backup --volumes-from dbdata -d centos tar cvf /backup/backup.tar /dbdata恢复
docker run –volumes –from dbdata2 –v(pwd):/backup busybox tar xvf /backup/backuptar