概述:
(1)架构
docker server:服务进程,管理所有容器,接受客户端操作。
docker client:远程控制器,远程控制服务器行为
通常二者在同一个机器上
(2)名词
镜像:容器运行的只读模板,由层构成,经过提交相应的层更新生成不同的容器
一般镜像构建过程:基础镜像——》中间件镜像 ——》应用镜像
容器:由镜像创建的程序运行环境,每次操作生成不同的层
layer 层: docker 每执行一条命令,就会生成一层,可以基于层提交生成具有不同操作的镜像。
仓库:存放镜像的地方。有本地仓库,远程仓库,共有仓库,私有仓库。
一 镜像
(1)搜索镜像
命令:docker search centos
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 2877 [OK]
ansible/centos7-ansible Ansible on Centos7 90 [OK]
jdeathe/centos-ssh CentOS-6 6.8 x86_64 / CentOS-7 7.2.1511 x8... 47 [OK]
jdeathe/centos-ssh-apache-php CentOS-6 6.8 x86_64 - Apache / PHP / PHP M... 23 [OK]
nimmis/java-centos This is docker images of CentOS 7 with dif... 18 [OK]
gluster/gluster-centos Official GlusterFS Image [ CentOS-7 + Glu... 14 [OK]
million12/centos-supervisor Base CentOS-7 with supervisord launcher, h... 12 [OK]
|
(2)获取镜像
命令:docker pull centos
(3)查看镜像
命令: docker images
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos java a10d7da10519 45 hours ago 1.447 GB
centos latest 0584b3d2cf6d 3 weeks ago 196.5 MB
|
(4)删除镜像
命令:docker rmi <REPOSITORY>:<TAG>
$ docker rmi centos:datauser
Untagged: centos:datauser
Deleted: sha256:febb9fe5ad20d8ea9c5680807b82c234b0bf8c3c91ca1ac04e33a3d920f6be42
Deleted: sha256:09f1f145834352976cf5433bb549886a05eb6f3b83536bca562af8e6c8fb5ac6
|
二 容器
(1)由镜像创建容器并启动
命令:docker run -tid —name <CONTAINER NAME> <REPOSITORY>:<TAG>
例如:docker run -tid —name java centos:latest
说明:
-t:docker 分配一个维终端并绑定到容器标准输入之上
-i: 让容器的标准输入保持打开,接收操作
-d:守护进程的方式连接
其他:由镜像启动一个容器并运行程序
docker run centos echo "hello world"
hello world
|
(2)连接容器
命令: docker exec -ti <容器id或名称> /bin/bash
(3)查看容器
a)查看运行的容器
命令: docker ps
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4712b78f0e5a centos:latest "/bin/bash" 8 hours ago Up 8 hours dataUser
|
b)查看所有容器
命令:docker ps -a
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4712b78f0e5a centos:latest "/bin/bash" 8 hours ago Up 8 hours dataUser
789ab62382eb centos:latest "/bin/bash" 8 hours ago Exited (127) 8 hours ago test
5387312fc962 centos:latest "/bin/bash" 8 hours ago Exited (137) 8 hours ago dataVol
|
(4)启动一个已存在的容器
命令:docker start <容器id | 容器名称>
(5)停止容器
命令:docker stop <容器id | 容器名称>
(6)删除容器
命令:docker rm <容器id | 容器名称>
(7)提交容器到镜像
命令:docker commit <容器ID | 容器名称> <仓库名称>:<Tag>
$ docker commit dataUser centos:datauser
sha256:febb9fe5ad20d8ea9c5680807b82c234b0bf8c3c91ca1ac04e33a3d920f6be42
|
三 端口映射
启动时映射宿主机和容器端口
命令:docker run -p <宿主机端口>:<容器端口> <镜像名称>
-p 指定的集中形式
(1)ip:hostPort:containerPort :指定宿主机ip指定端口映射容器的端口
(2)ip::containerPort:指定宿主机ip,系统随机分配端口,映射到容器端口
(3)hostPort:containerPort:宿主机任意ip,指定端口,映射到容器端口
(4)containerPort:系统随机分配端口,映射到容器端口
检测命令:
docker port $container_id | $container_name
注:
1)容器要增加端口,需要提交成镜像,然后重新绑定端口,原先绑定的端口在启动镜像时需要重新绑定
2)查看端口要使用 docker port , docker ps 显示的不靠谱
开四个端口映射样例
$ docker run -itd -p 9200:9200 -p 9201:9201 -p 9300:9300 -p 9301:9301 --name search centos:java
e54a6dfc3a8d430fa8b7c2a7bdd65949423cb4da5c7a6013b6871b9e490ac039
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e54a6dfc3a8d centos:java "/bin/bash" 4 seconds ago Up 3 seconds 0.0.0.0:9200-9201->9200-9201/tcp, 0.0.0.0:9300-9301->9300-9301/tcp search
$ docker port search
9200/tcp -> 0.0.0.0:9200
9201/tcp -> 0.0.0.0:9201
9300/tcp -> 0.0.0.0:9300
9301/tcp -> 0.0.0.0:9301
|
四 拷贝数据
命令: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
1)向容器内拷贝:docker cp [本地路径] [容器名]:[容器路径]
例如:docker cp /tmp/test.txt d8f7c83ba660:/tmp
2)从容器内拷出:docker cp [容器名]:[容器路径] [本地路径]
例如:docker cp d8f7c83ba660:/tmp/test.txt /tmp
五 加载数据卷
(1)挂载目录
启动镜像时,将宿主机指定目录挂载到指定镜像的指定目录上
docker run -tid -v /tmp:/tmp —name data centos:latest
说明:通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径,此时默认开放读写权限。
需要指定权限如下:
docker run -tid -v /tmp:/tmp:ro —name data centos:latest
如果需要挂载多个目录,调用多次 -v进行挂载
(2)挂在数据卷
数据卷:普通 docker容器,用于供其他容器挂在使用。
a)创建数据卷:同上
docker run -tid -v /tmp:/tmp --name dataVol centos:latest
b)挂载数据卷:
docker run -tid --volumes-from dataVol --name dataUser centos:latest
附录:其他
(1) Docker 容器Root密码
yum install passwd 安装passwd软件;
执行passwd命令,修改root用户密