Docker核心组件
镜像 Images
容器 Container
仓库 Repository
Docker 镜像(Image)类似于虚拟机镜像,可以将它理解为一个面向Docker引擎的只读模板,包含了文件系统
镜像是创建容器的基础。
Docker容器
Docker容器(Container)类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器可看做一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等),及运行在其中的应用程序打包而成的应用盒子。
Docker仓库 Repository类似于代码仓库,是Docker集中存放镜像的场所。
一、Docker服务安装、启动、停止
1.安装:CentOS 7: yum -y install docker
启动 service docker start
停止 service docker stop
重新启动 service docker restart
为避免每次使用docker命令都要用特权身份,可以将当前用户加入安装docker时自动创建的docker用户组
$sudo usermod -aG docker steven
另需要把steven加sudo权限
visudo -f /etc/sudoers 加入
steven ALL=ALL(ALL) ALL
修改后,su - steven切换到steven用户下,可用sudo启动、停止、重新启动docker服务
启动 sudo service docker start
停止 sudo service docker stop
重新启动 sudo service docker restart
其它docker操作直接执行命令即可。例如 docker images 、docker ps、 docker run等
[steven@localhost ~]$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 3f8a4339aadd 3 days ago 108MB
gitlab/gitlab-ce latest 905f149c0946 3 weeks ago 1.38GB
registry latest 177391bcf802 4 weeks ago 33.3MB
hello-world latest f2a91732366c 5 weeks ago 1.85kB
[steven@localhost ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[steven@localhost ~]$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98b70681d201 nginx "nginx -g 'daemon of…" 2 days ago Exited (0) 12 minutes ago nginx
[steven@localhost ~]$ docker start 98b70681d201
98b70681d201
二、 镜像
1.镜像获取
docker pull
例如获取 ubuntu 14.04
docker pull ubuntu:14.04
2.镜像上传
docker push
3.镜像查看
a.docker images
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/gitlab/gitlab-ce latest 8b77e7f764d5 13 days ago 1.368 GB
docker.io/jenkins latest 5fc84ab0b7ad 2 weeks ago 808.9 MB
b. docker inspect 镜像名称
可获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。
4.镜像删除
a. docker rmi 镜像id
b. docker rmi 镜像标签
5. 使用history命令查看镜像历史。镜像由多个层组成。该命令将列出各层的创建信息
docker history ubuntu:14.04
6. 搜索镜像
docker search --automated -s 3 nginx
7. 创建镜像
a. 基于已有镜像的容器创建 docker commit
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
如创建一个test文件,再退出
$docker run -it ubuntu:14.04 /bin/bash
#touch test
#exit
容器ID为 a925cb40b3f0
b docker commit -m "Added a new file" -a "Docker new" a925cb40b3f0 test:0.1
基于本地模板导入
cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
6. 存出镜像
docker save -o ubuntu_14.04.tar ubuntu:14.04
7. 载入镜像
docker load --input ubuntu_14.04.tar
docker load < ubuntu_14.04.tar
三、images镜像创建
在Dockerfile当前目录创建镜像
sudo docker build -t "ouruser/sinatra:v2" .
导出容器
sudo docker export 17de96f79c7e > devel.tar
导入容器快照
cat devel.tar | sudo docker import - test/devel:v1.0
四、 容器
1.容器是镜像的一个带有额外的可写文件层的运行实例。
Docker容器就是独立运行的一个或一组应用,以及它们的必需运行环境。
2.创建容器 docker create
$sudo docker create -it ubuntu:latest
docker create新建的容器处于停止状态,可用docker start来启动它
3.新建并启动容器 docker run=docker create + docker start
启动容器有两种方式,一是基于镜像新建一个容器并启动,另一个是将在终止状态(stopped)的容器重新启动。
$ sudo docker run -i -t ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
这里的ubuntu:14.04是镜像名称, ubuntu是镜像名称、14.04是镜像tag
-t 选项让Docker分配一个伪终端 (pseudo-tty)并绑定到容器的标准输入上,
-i 则让容器的标准输入保持打开
docker run后加 -d 让容器在后台以守护态运行
$ sudo docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
4.启动、停止、重启
docker start/stop/restart 容器ID
例如:docker start/stop/restart a6961e6a3f56
5.查看容器信息
查看正在运行的容器 docker ps
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6961e6a3f56 gitlab/gitlab-ce "/assets/wrapper" 2 weeks ago Up 20 hours (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp gitlab
查看所有容器
docker ps -a
6.查看容器日志
docker logs 容器ID
例如:sudo docker logs a6961e6a3f56
7.进入容器
a. docker attach命令
$sudo docker run -idt ubuntu
$sudo docker ps
容器names为nostalgic_hypatia
$sudo docker attach nostalgic_hypatia
root@243c32535da7:/#
使用attach命令不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法操作。
b. docker exec (Docker 1.3版本起)
$sudo docker exec -ti 243c32535da7 /bin/bash
root@243c32535da7:/#
8.删除容器
docker rm [OPTIONS] CONTAINER
支持的选项包括:
-f, --force=false 强行终止并删除一个运行中的容器
-l, --link=false 删除容器的连接,但保留容器。
-v, --volumes=false 删除容器挂载的数据卷。
9、导入和导出容器
a.导出容器
docker export CONTAINER
$sudo docker export ce5 >test_for_run.tar
$sudo docker export e81 >test_for_stop.tar
可将这些文件传输到其他机器上,在其他机器上通过导入命令实现容器的迁移
b.导入容器
docker import 导入一个容器快照到本地镜像库
$cat test_for_run.tar | sudo docker import - test/ubuntu:v1.0
$sudo docker images
容器快照、镜像存储文件(load)的区别
容器快照文件将丢弃所有的历史记录和元数据信息(即公保存容器当时的快照状态),
而镜像存储文件将保存完整记录,体积也要大。
另外从容器快照文件导入时可重新指定标签等元数据信息
10. 在docker和宿主机之间复制文件
1.用-v挂载主机数据卷到容器内
docker run -v /path/to/hostdir:/mnt $container
在容器内拷贝
cp /mnt/sourcefile /path/to/destfile
2.直接在主机上拷贝到容器物理存储系统
3.用输入输出符
具体方法这篇文章写的很详细:http://blog.csdn.net/yangzhenping/article/details/43667785
但是对这三种方法我都不太喜欢,无意间看到另位一种方法供大家参考:
从主机复制到容器sudo docker cp host_path containerID:container_path
从容器复制到主机sudo docker cp containerID:container_path host_path
容器ID的查询方法想必大家都清楚:docker ps -a
五、docker 容器启动以后如何动态修改内存大小和cpu资源
1.docker ps查看正在运行的容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a6961e6a3f56 gitlab/gitlab-ce "/assets/wrapper" 2 weeks ago Up 4 minutes (health: starting) 0.0.0.0:80->80/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp gitlab
2.停止此容器
[root@localhost ~]# docker stop a6961e6a3f56
a6961e6a3f56
3.用docker update更新此容器所使用的内存和交换内存
[root@localhost ~]# docker update --memory=3096m --memory-swap=4072m a6961e6a3f56
a6961e6a3f56
4.启动此容器
[root@localhost ~]# docker start a6961e6a3f56
5.docker update --help查看docker update命令说明
[root@localhost ~]# docker update --help
Usage: docker update CONTAINER [CONTAINER...]
Update configuration of one or more containers
--blkio-weight Block IO (relative weight), between 10 and 1000
-c, --cpu-shares CPU shares (relative weight)
--cpu-period Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota Limit CPU CFS (Completely Fair Scheduler) quota
--cpuset-cpus CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems MEMs in which to allow execution (0-3, 0,1)
--help Print usage
--kernel-memory Kernel memory limit
-m, --memory Memory limit
--memory-reservation Memory soft limit
--memory-swap Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--restart Restart policy to apply when a container exits
六、仓库
七、数据管理
容器中管理数据主要有两种方式
数据卷(Data Volumes)
数据卷容器(Data Volume Containers)
1.数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可提供很多有用的特性:
数据卷可在容器之间共享和重用。
对数据卷的修改会立即生效。
对数据卷的更新,不会影响镜像
卷会一直存在,直到没有容器使用。
数据卷的使用,类似Linux下对目录或文件进行mount操作。
a.在容器内创建一个数据卷
使用trainnig/webapp镜像创建一个Web容器,并创建一个数据卷挂载到容器的/webapp
-P 是允许外部访问容器需要暴露的端口
$ sudo docker run -d -P --name web -v /webapp trainnig/webapp python app.py
b. 挂载一个主机目录作为数据卷
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp trainnig/webapp python app.py
上面的命令加载主机的 /src/webapp目录到容器的/opt/webapp目录
Docker挂载数据卷的默认权限是读写(rw),用户也可通过 ro指定为只读
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro trainnig/webapp python app.py
c.挂载一个本地主机文件作为数据卷
$ sudo docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash
这样就可记录在容器中输入过的命令历史了。
推荐的方式是直接挂载文件所在的目录。
2.数据卷容器
若用户需在容器之间共享一些持续更新的数据,可用数据卷容器
a.创建一个数据卷容器并创建一个数据卷挂载到/dbdata
$ sudo docker run -it -v /dbdata --name dbdata ubuntu
root@3ed94f279b6f:/#
root@3ed94f279b6f:/# ls
可在其他容器中使用--volumes-from 来挂载dbdata容器中的数据卷
$ sudo docker run -it --volumes-from dbdata --name db1 ubuntu
$ sudo docker run -it --volumes-from dbdata --name db2 ubuntu
容器db1和db2都挂载同一个数据卷到相同的/dbdata。三个容器任一容器在该目录下的写入,其他容器都可看到。
3.利用数据卷容器迁移数据
可利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。
a.备份
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
利用ubuntu镜像创建一个容器worker.使用--volumes-from dbdata来让worker容器挂载dbdata容器的数据卷;
用-v $(pwd):/backup 挂载本地的当前目录到worker容器的/backup目录
worker容器启动后,用tar cvf /backup/backup.tar /dbdata 将/dbdata下内容备份为容器内的/backup/backup.tar
b.恢复
先创建一个带有数据卷的容器dbdata2
$ sudo docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
再创建一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
八、网络基础配置
1.端口映射实现访问容器
a.从外部访问容器应用
可通过 -P 或 -p参数来指定端口映射. 当用-P时,Docker会随机映射一个49000~49900的端口到容器内部开放的网络端口
$ sudo docker run -d -P training/webapp python app.py
docker ps 可看到本地主机的49155被映射到容器的5000端口
b.映射所有接口地址
使用hostPort:containerPort
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
c.映射到指定地址的指定端口
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
d.映射到指定地址的任意端口
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
还可用udp来指定udp端口
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
2.容器互联
使用 --link参数可让容器之间安全的进行交互
建一个数据库容器
$ sudo docker run -d --name db training/postgres
创建一个web容器,并将它连接到db容器
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
--link参数的格式为 --link name:alias name是要链接的容器的名称, alias是这个连接的别名
Docker通过两种方式为容器公开连接信息:
环境变量
更新 /etc/hosts文件
$ sudo docker run --rm --name web2 --link db:db training/webapp env
九、Docker swarm/Docker Service
docker service 服务查看、创建、日志、显示、检查状态等
[root@docker-ms01 galaplat-order-center]# docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service