文章目录
1.Docker容器化技术简介
1.1什么是Docker?
- 一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口;
- 使用go语言编写,在LCX(linux容器)基础上进行封装
- 三点
- 快速部署应用启动
- 实现虚拟化,完整资源隔离
- 一次编写,四处运行
1.2.为什么要用docker?
- 提供一次性的环境,加入需要安装mysql,则需要安装很多依赖库、版本等,如果使用Docker则通过镜像就可以直接启动运行
- 快速动态扩容,使用docker部署了一个应用,可以制成镜像,通过docker快速启动
- 组件微服务架构,可以在一个机器上模拟出多个微服务,启动多个应用
- 更好的资源隔离和共享
2.Linux Centos7安装Docker
2.1.安装Docker
- 安装环境:Centos7
- 安装条件:docker官方至少要求3.8,建议3.10以上
- 查看centos内核版本
uname -a
-
Docker版本
- docker EE 企业版本
- docker CE 社区版本
-
安装前准备
- 关闭防火墙
- systemctl stop firewalld
- 关闭selinux
- vi /etc/selinux/config —>将SELINUX=disabled
- 关闭防火墙
-
安装wget命令
- 挂载磁盘,yum -y install wget
-
下载阿里云docker社区版yum源
- cd /etc/yum.repos.d/ 进入到yum源的路径
- wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- cd /etc/yum.repos.d/ 进入到yum源的路径
-
重新构件yum源
- yum clean all
- yum makecache
-
查看docker安装包
- yum list | grep docker
-
如果出现如下错误,则需安装contain-SElinux包
-
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
-
yum clean all
-
yum update
-
安装docker ce社区版
- yum -y install docker-ce.x86_64
-
设置开机自启
- systemctl enable docker
-
更新xfsprogs
- yum -y update xfsprogs
-
启动docker容器
- systemctl start docker
-
查看docker版本
- docker version
-
查看docker详细信息
- docker info
2.2.配置阿里云镜像加速
- 新建文件:vi /etc/docker/daemon.json
- 编辑文件
{
"registry-mirrors": ["https://6j96rs65.mirror.aliyuncs.com"]
}
- 重启docker
- systemctl daemon-reload
- systemctl restart docker
3.Docker镜像的搜索下载以及查看删除
3.1.什么是镜像?
镜像(Mirroring)是一种文件存储形式,是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本即为镜像。可以把许多文件做成一个镜像文件,与GHOST等程序放在一个盘里用GHOST等软件打开后,又恢复成许多文件,RAID 1和RAID 10使用的就是镜像。常见的镜像文件格式有ISO、BIN、IMG、TAO、DAO、CIF、FCD。
3.2.查看本地镜像
docker images
3.3.搜索镜像
docker search centos
3.4.搜索镜像并过滤是官方的
docker search --filter "is-official=true" centos
3.5.搜索镜像并过滤大于10颗星的
docker search --filter stars=10 centos
3.6.下载centos7镜像
docker pull centos:7
3.7.修改本地镜像名字
docker tag mycentos:1 centos:7
3.8.本地镜像的删除
docker rmi centos:7
3.9.Docker的体系结构之镜像与容器
- 一个镜像可以启动无数台容器
- 容器与容器之间的操作互不影响,处于隔离的环境
4.Docker核心基础之容器的构建
- 构建容器:docker run -itd --name=mycentos centos:7
- -i:表示以交互模式运行容器(让容器的标准输入保持打开)
- -d:表示后台运行容器,并返回容器ID
- -t:为容器重新分配一个伪输入终端
- –name:为容器指定名称
- 查看本地所有容器:docker ps -a
- 查看本地正在运行的容器:docker ps
- 停止容器:docker stop CONTAINER_ID/CONTAINER_NAME
- 一次性停止所有容器:docker stop $(docker ps -a -q)
- 启动容器:docker start CONTAINER_ID/CONTAINER_NAME
- 重启容器:docker restart CONTAINER_ID/CONTAINER_NAME
- 删除容器:docker rm CONTAINER_ID/CONTAINER_NAME
- 强制删除容器:docker rm -f CONTINAER_ID/CONTINAER_NAME
- 查看容器详细信息:docker inspect CONTIANER_ID/CONTINAER_NAME
- 进入容器:docker exec -it CONTINAER_ID/CONTINAER_NAME /bin/bash
5.Docker容器的文件复制与挂载
- 从宿主机复制到容器:docker cp 宿主机本地绝对路径 容器名字/ID:容器绝对路径
- docker cp /root/1.txt mycentos:/root/
- 从容器复制到宿主机:docker cp 容器ID/NAME:容器绝对路径 宿主机绝对路径
- docker cp mycentos:/root/2.txt /root/
- 宿主机文件夹挂载到容器里:docker run -itd -v 宿主机路径:容器路径 --name 容器名称 镜像ID
- docker run -itd -v /root/test/:root/ --name=centos7 centos:7
6.Docker核心自定义镜像
6.1.构建镜像的两种方法
- 基于Docker Commit制作镜像
- 基于DockerFile制作镜像,DockerFile方式为主流的制作镜像方式
6.2.Commit构件自定义镜像
- 启动容器:docker run -itd mycentos
- 进入容器:docker exec -it mycentos /bin/bash
- 安装ifconfig命令:yum -y install net-tools
- 重启容器:docker restart mycentos
- 删除容器:docker rm mycentos
- 构件镜像:docker commit -a “作者” -m “描述” 原CONTAINER_ID 新容器image
- docker commit -a “lixiang” -m “ifconfig命令” 180176be1b4c centos7:v1
- -a:指定作者
- -m:描述
- 产看容器详情:docker insecpt 180176be1b4c
- 启动容器:docker run -itd 180176be1b4c
6.3.DockerFile构建镜像
- dockerfile
#注释:这个脚本是干啥的,this is dockerfile
FROM centos:7 #从哪来的,基于centos:7这个镜像
MAINTAINER lixiang #作者
RUN echo "正在构建镜像!!!"
WORKDIR /root/lixiang #指定工作目录,如无则自动给出创建
COPY 123.txt /root/lixiang #赋值123.txt到/root/lixiang,注意一定要用相对路径,123.txt要和dockerfile载一个目录下
RUN yum -y install net-tools
- 构件镜像:docker bulid -t mycentos:v2 .
6.4.Docker镜像分层结构剖析
- dockerfile执行过程
- 总结:
- 共享资源
- 对容器的任何改动都不会影响镜像层
- 容器层可读可写,镜像层只读
6.5.Dockerfile基础命令
- FROM
- 基于那个镜像构建
- MAINTAINER
- 标明作者
- COPY
- 复制宿主机文件到镜像中(只能用相对路径,绝对路径会报错)
- ADD
- 复制宿主机文件到镜像中(加入文件是.tar.gz,他会帮解压到指定目录)
- WORKDIR
- 指定工作目录,假如路径不存在会创建目录
- ENV
- 指定环境变量
- EXPOSE
- 暴漏容器端口
- RUN
- 执行动作,用于构建镜像层,作用于镜像层面
- ENTRYPOINT
- 容器启动的时候执行,作用于容器层,dockerfile里面有多条时只执行最后一条
- CMD
- 在容器启动的时候执行,作用于容器层,dockerfile里面有多条时只执行最后一条
- 容器启动后执行默认的命令或参数,允许被修改
- 命令格式
- shell命令格式:RUN yum -y install net-tools
- exec命令格式:RUN [ “yum”,“-y”,“install”,“net-tools” ]
- 测试
- 第一个dockerfile
#第一个
FROM centos:7
RUN echo "images building!"
CMD ["echo","container","starting..."]
ENTRYPOINT ["echo","container","starting !!!"]
- 第二个dockerfile
#第二个
FROM centos:7
RUN echo "images building!"
CMD ["echo","containe1r","starting..."]
CMD ["echo","container2","starting..."]
ENTRYPOINT ["echo","container2","starting !!!"]
ENTRYPOINT ["echo","container2","starting !!!"]
- 第三个dockerfile
#第三个
FROM centos:7
CMD ["-ef"]
ENTRYPOINT ["ps"]
6.6.Dockerfile构建Tomcat镜像
-
本机构建环境
- 解压 jdk :tar -xvf jdk-8u211-linux-x64.tar.gz;mv jdk1.8.0_211 /usr/local/jdk8
- 解压tomcat : tar -xvf apache-tomcat-8.5.35.tar.gz;mv apache-tomcat-8.5.35 /usr/local/tomcat
-
配置java的环境变量
- vi /etc/profile
- export JAVA_HOME=/usr/local/jdk1.8
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
- source /etc/profile
-
本机测试启动tomcat(本机测试注意关闭防火墙)/usr/local/tomcat/bin/startup.sh
-
本机测试通过开启防火墙:systemctl start firewalld
-
编写dockerfile文件
-
#dockerfile构建tomcat,安装jdk
FROM centos:7
MAINTAINER lixiangADD jdk-8u211-linux-x64.tar.gz /usr/local/
RUN mv jdk1.8.0_211 jdk1.8
ENV JAVA_HOME=/usr/local/jdk1.8
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
ENV PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local/
RUN mv apache-tomcat-8.5.35 tomcat
EXPOST 8080
ENTRYPOINT [“/usr/local/tomcat/bin/catalina.sh”,“run”]
-
-
执行dockerfile文件
- docker build -t centos:tomcat .
-
启动docker镜像
- docker run -itd -p 80:8080 -v /root/tomcat/ROOT:/usr/local/tomcat/webapps/ROOT centos:tomcat /bin/bash
6.7.Dockerfile构建Nginx镜像
- nginx_install.sh脚本编写
- touch nginx_install.sh ; chmod u+x nginx_install.sh ; vi nginx_install.sh
- #!/bin/bash
- yum -y install gcc gcc-c++ make pcre pcre-devel zlib zlib-devel
- cd /usr/lcoal/nginx
- ./configure --prefix=/user/local/nginx && make && make install
- touch nginx_install.sh ; chmod u+x nginx_install.sh ; vi nginx_install.sh
- dockerfile文件编写
- vi dockerfile
- #dockerfile安装nginx镜像
- FROM centos:7
- ADD nginx-1.16.0.tar.gz /usr/lcoal
- COPY nginx_install.sh /usr/local
- RUN /usr/local/nginx_install.sh
- EXPOSE 80
- vi dockerfile
- 启动容器
- docker run -itd 80:80 centos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
6.8.Dockerfile构建Redis镜像
- 编写redis编译安装shell脚本 redis_install.sh
- #!/bin/bash
yum install -y gcc gcc-c++ make openssl openssl-devel
cd /usr/local/redis-4.0.9
make && make PREFIX=/usr/local/redis install
mkdir /usr/local/redis/conf
cp /usr/local/redis-4.0.9/redis.conf /usr/local/redis/conf/
sed -i ‘69s/127.0.0.1/0.0.0.0/’ /usr/local/redis/conf/redis.conf
sed -i ‘88s/protected-mode yes/protected-mode no/’ /usr/local/redis/conf/redis.conf
- #!/bin/bash
- 编写dockerfile
- #dockerfile部署redis镜像
FROM centos:7
ADD redis-4.0.9.tar.gz /usr/local/
COPY redis_install.sh /usr/local/
RUN sh /usr/local/redis_install.sh
ENTRYPOINT [“/usr/local/redis/bin/redis-server”,“/usr/local/redis/conf/redis.conf”]
- #dockerfile部署redis镜像
- 执行dockerfile :docker build -t centos:redis .
- 启动容器:docker run -itd -p 6379:6379 centos:redis /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
- 进入容器:docker exec -it 9b402baeaba7 /bin/bash
6.9.Dockerfile构建Mysql镜像
- 拉取mysql:5.7镜像
- docker pull mysql:5.7
- 编写dockerfile文件基于5.7mysql再创镜像
- FROM mysql:5.7
- WORKDIR /docker-entrypoint-initdb.d
- ENV LANG=C.UTF-8
- ADD init.sql
- 构建镜像:docker build -t mysql_new:5.7 .
- 启动镜像:docker run -itd --name=mysql_5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql_new:5.7
7.Docker网络模式
7.1.Docker默认三种网络模式
- bridge:桥接模式
- host:主机模式
- none:无网络模式
查看网络模式:docker network ls
7.2.Docker容器bridge模式
-
桥接模式是docker的默认网络设置,当Docker服务启动时,会在主机上创建一个名为docker0的虚拟网桥,并选择一个和宿主机不同的IP地址和子网分配给docker0网桥。
-
桥接拓补图:
- 宿主机安装bridge-utils工具
- yum -y install bridge-utils
- 进入nginx容器查看网卡
- NAT技术
NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Engineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术,如下图所示。因此我们可以认为,NAT在一定程度上,能够有效的解决公网地址不足的问题。
7.3.Docker容器host模式
- host模式:该模式下容器是不会拥有自己的IP地址,而是使用宿主的ip地址和端口。
- 启动nginx容器命令并防火墙放开80端口
- docker run -d --net=host mycentos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
- firewall-cmd --zone=public --add-port=80/tcp --permanent
- firewall-cmd --reload
7.4.Docker容器none模式
- none模式无法连接外网,一般用于测试用,基本不怎末使用
7.5.Docker容器间基于Link实现单项通信
- 实现单向通信通过 “–link 容器名” 来指定,在需要向其他容器通信的容器上加上–link
- Docker容器桥接模式每次启动都是随机分配ip,当容器挂掉,ip重变,所以要指定容器名
- 注意:要先启动被通信的容器,否则–link 找不到容器名会报错
- 启动数据库容器:docker run -itd --name=mydb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
- 在启动centos:docker run -itd --name mycentos --link mydb centos:5.7
7.6.Docker容器间利用bridge网桥实现双向通信
-
创建一个新的bridge网桥:docker network create -d bridge my_bridge
-
查看网络模式:docker network ls
- 启动第一个容器:docker run -itd --name=centos1 centos:7
- 启动第二个容器:docker run -itd --name=centos2 centos:7
- 把第一个容器加入到网桥:docker network connect my_bridge centos1
- 把第二个容器加入到网桥:docker network connect my_bridge centos2
- 验证两个容器是否可以相互ping通
8.Docker容器特权模式
8.1Docker容器特权模式
-
特权模式就是赋予容器大于root的权限,在容器中有些操作root用户也无法执行,这回就需要去给容器特权模式。
-
启动一个普通的容器
- docker run -itd --name=centos1 centos:7
-
进入容器执行删除gateway操作
- docker exec -it centos1 /bin/bash
- yum -y install net-tools
- route -n
- route del default gw 127.0.0.1
- 以特权模式启动容器
- docker run -itd --name=centos2 --privileged=true centos:7
- 重复上面操作删除网关
9.Docker容器Volume数据共享
9.1使用dockerfile进行数据共享
FROM centos:7
VOLUME ["/usr/local"]
执行dockerfile后就会将容器的usr/local下的内容映射到宿主机var下的随机文件夹而且不能改变
9.2使用volume容器共享创建nginx集群
- 使用**–volumes-from**实现容器于容器之间的共享
- 创建nginx1
- docker run -itd -v /nginx/html/:usr/local/nginx/html/ -p 8080:80 --name=nginx1 centos:nginx /usr/local/nginx/sbin/nginx -g “daemon off;”
- 创建nginx2
- docker run -itd -p 8081:80 --volumes-from nginx1 --name=nginx2 centos:nginx /usr/local/nginx/sbin.nginx -g “daemon off;”
- 创建nginx3
- docker run -itd -p 8081:80 --volumes-from nginx1 --name=nginx3 centos:nginx /usr/local/nginx/sbin.nginx -g “daemon off;”
- 浏览器访问,查看挂载信息
- 创建nginx1
10.Docker-Compose容器操作
10.1.Docker-Compose安装
- 下载1.25.0 docker compose
curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 这个是官方地址,可能比较慢,推荐使用下面的国内镜像地址
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 国内镜像地址
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
- 添加可执行的权限
chmod u+x /usr/local/bin/docker-compose
- 测试版本
docker-compose --version
10.2.Compose常用指令
- 编写简单的docker-compose.yml文件
version: '3'
services:
redis:
image: centos:redis
- 运行docker-compose.yml文件:docker-compose up -d(后台运行)
- 查看容器运行情况:docker-compose ps
- 删除容器:docker-compose down
- 删除容器并且删除volumes:docker-compose down --volumes
- 停止启动容器:docker-compose stop
- 进入容器:docker-compose exec redis bash
注意:要在有docker-compose的目录下执行docker-compose up -d
10.3.Compose yml的常用配置
-
docker-compose.yml的三大部分:version(yml的版本)、services(容器服务)、networks(网络模式)
-
compose设置网络模式:network_mode: “网络模式”(host、nono、bridge)
-
compose设置端口映射:
-
host: - "宿主机端口:容器端口"
-
compose设置文件共享
-
volumes: - "宿主机路径:容器路径"
-
compose设置额外参数
command: /usr/local/nginx/sbin/nginx -g "daemon off;"
-
编写docker-compose.yml文件
version: '3'
services:
nginx:
image: nginx:latest
ports:
- "8080:80"
redis:
image: redis:latest
ports:
- "6379:6379"
- 检验本机端口占用情况:
- ps -ef | grep nginx
- netstat -tunlp | grep 进程号
10.4.Docker-Compose搭建个人博客
- docker-compose.yml文件编写
version: "3.2"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- wordpress_data:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
wordpress_data: {}
- 运行docker-compose.yml
- docker-compose up -d
- docker-compose down:删除容器和网络,会保留wordpress数据库
- docker-compose --volumes:全部删除
10.5.Docker-Compose 详细分析
version: "3.2" #yml语法版本
services: #容器服务
db: #容器名
image: mysql:5.7 #镜像
volumes: #挂载,宿主机与容器共享文件
- db_data:/var/lib/mysql #采用的是卷标的形式挂载
restart: always #服务重启,always总是
environment: #环境
MYSQL_ROOT_PASSWORD: somewordpress #数据库密码
MYSQL_DATABASE: wordpress #数据库名
MYSQL_USER: wordpress #用户名
MYSQL_PASSWORD: wordpress #密码
wordpress:
depends_on: #依赖于某个容器,只有依赖的容器成功启动,才会启动wordpress服务
- db #-db 是参数是依赖的容器名称
image: wordpress:latest #镜像
volumes: #挂载,宿主机与容器共享文件
- wordpress_data:/var/www/html #采用的是卷标的形式挂载
ports: #设置映射端口
- "8000:80"
restart: always #服务重启,always总是
environment: #环境设置
WORDPRESS_DB_HOST: db:3306 #采用db的配置
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes: #卷标的形式挂载
db_data: {}
wordpress_data: {}
11.Docker镜像仓库实战
11.1.镜像仓库简介
- 什么是镜像仓库
- 存放很多镜像的仓库
- 为什么要使用镜像仓库
- 起到备份作用
- 方便其他机器下载使用
- 镜像仓库的种类
- 公共镜像仓库
- 官方:https://hub.docker.com/,基于各个软件开发或者有软件提供商开发的
- 非官方:其他组织或者公司开发的镜像,供大家免费使用
- 私有镜像仓库
- 公司自己搭建的,用于存放公司内部的镜像,自己管理,不提供给外部使用,避免了商业项目暴露出去的风险。
- 公共镜像仓库
11.2.阿里云镜像仓库的搭建与使用
- 登录阿里云创建镜像仓库
- 选择个人版实例
- 创建仓库
- 选择代码源
- 登录远端阿里云镜像仓库
docker login --username=李祥asdds registry.cn-hangzhou.aliyuncs.com
- 打包镜像仓库
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lixiang19_test/mysql:[镜像版本号]
- 推送到远端阿里云镜像仓库
docker push registry.cn-hangzhou.aliyuncs.com/lixiang19_test/mysql:[镜像版本号]
- 从阿里云镜像仓库拉取
docker pull registry.cn-hangzhou.aliyuncs.com/lixiang19_test/mysql:[镜像版本号] (注意先登录阿里云镜像仓库)
11.3.企业核心之harbor仓库搭建
- 前置环境:docker、docker-compose、openssl、python2.7以上
- 上传harbor压缩包解压:tar -xvf harbor…
- 修改配置:harbor.yml
- 修改主机名(注意空格):hostname: 192.168.0.151
- 修改密码(注意空格):harbor_admin_password: Harbor12345
- 进入到解压包里执行脚本prepare
- 执行完prepare脚本,会生成docker-compose.yml文件,执行 sh install.sh脚本
- 访问Harbor,默认用户名admin
- 访问默认是80端口
11.4.企业核心之harbor仓库配置和使用
- 配置使用docker仓库
- 默认docker只允许访问https仓库
- 如果要访问http的仓库需要自己配置
- 配置允许访问http仓库:/etc/docker/daemon.json
{
"insecure-registries":["http://192.168.0.151"]
}
- 重启docker服务:systemctl restart docker
- 创建自己的仓库名
- 登录 docker login --username=admin 192.168.10.105
- 打包镜像:docker tag 容器id 192.168.0.105/xdclass/mysql:5.7
- 上传docker镜像:docker push 192.168.10.105/xdclass/mysql:5.7
- 拉取docker镜像:docker pull 192.168.10.105/xdclass/mysql:5.7
- 登出:docker logout
- 注意:docker login后会有一个登录凭证(可删除,下次需要密码):/root/.docker/config.json
11.5.本地镜像容器的载入与载出
-
两种办法:
- 保存镜像
- 保存容器
-
保存镜像:
- docker save 镜像ID -o /usr/local/镜像名称.jar
-
载入镜像
- docker load -i 镜像名称.jar
-
保存容器
- docker export 容器ID -o /usr/local/容器名称.jar
-
载入容器
- docker import 容器名称.jar
-
微服务打包docker镜像
- 最外层 mvn clean install
- 子项目:mvn install -Dmaven.test.skip=true dockerfile:build
- 启动:docker run --name 容器名字 -d -p 端口映射 镜像id