安装完后更换阿里云镜像:
vim /etc/docker/daemon.json
输入下面内容
{
"registry-mirrors": ["https://r1xt5cgh.mirror.aliyuncs.com"]
}
重新导入配置
systemctl daemon-reload
systemctl restart docker
常用命令
docker images #列出已经下载的镜像
docker images -q #列出镜像id
docker info #查看docker安装信息
docker search 镜像名 #搜索镜像
docker search --no-trunc 镜像名 #搜索镜像时显示所有描述信息
docker pull 镜像名:标签 #拉取镜像,如果不跟上标签名,默认下载最新版
docker rmi 镜像名 #删除镜像
docker ps #查看正在运行的容器
docker ps -a #查看所有的容器
docker ps -l #查看最后一次运行的容器
docker ps -f status=exited #查看已经停止的容器
docker run [option] 镜像名[:标签名] #创建和运行容器
-i 表时交互式运行容器,容器创建后,会启动并进入容器内部,通常与-t同时使用。
-t 启动后进入容器命令行,通常与-i同时使用,加入-it两格参数后,容器创建就能登录进去,即分配一个伪终端。
-name 为创建的容器指定一个名称。
-d 创建一个守护式容器,并返回容器id。容器并不会立即运行,如果加上-i参数,就会立即运行。
-v 表时目录影射,格式为-v 宿主机目录:容器目录。
-p 表示端口映射,格式为-p 宿主机端口:容器端口。
docker run -it --name=centos centos:7 [/bin/bash] #启动一个Centos容器,中括号内可以省略
exit #在容器中执行,退出当前容器,容器会停止运行
ctrl+p+q #退出容器,但是容器不会停止运行
docker stop 容器名 #停止容器
docker start 容器名 #启动容器
docker restart 容器名 #重启容器
docker rm [-f] 容器名 #删除容器
docker ps -a -q或docker ps -aq #查看所有容器的id,-a表示所有,-q表示查id
docker rm -f `docker ps -aq` #删除所有容器,反引号内传入查询id的命令即可
docker stop `docker ps -aq` #停止所有容器
docker start `docker ps -aq` #删除所有容器
docker kill 容器名|容器id #强制停止,一般不使用
docker run -id --name=centos centos #创建并后台运行一个Centos容器
docker exec -it 容器名 /bin/bash #登录并进入一个正在运行的容器,通过此方式进入后,exit退出也不会停止容器。
docker cp 宿主机文件或目录 容器名称:容器内目录 #复制宿主机文件到容器内部
docker cp 容器名称:容器内目录 宿主机文件或目录 #复制容器内文件到宿主机
docker run -id -v 宿主机绝对路径目录:容器内目录[:ro] --name=容器名 镜像名 #创建并后台运行一个容器,将容器内部目录映射到宿主机,如果加上中括号内的内容,则目录为只读,ro=read only
docker run -id -v /opt:/opt:ro --name=centos centos #启动并后台运行一个centos容器,挂载opt目录到宿主机,并且设置为只读。
docker inspect 容器名 #查看容器内部细节
docker部署实战
docker run -id --name=mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql #启动并运行一个MySQL容器,-e设置容器内参数,此处设置密码为123456
docker exec -it mysql mysql -uroot -p123456 #连接到mysql容器内的mysql数据库
docker run -id --name=redis -p 6379:6379 redis #启动并运行一个redis容器
docker run -id --name=tomcat -p 8888:8080 -v /usr/local/project:/usr/local/tomcat/webapps --privileged true tomcat #启动一个tomcat容器,多级映射可能会有权限问题,所以使用--privileged true
docker run -id --name=rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management #启动一个rabbitmq容器,默认用户名guest,密码guest
docker run -id --name=rabbitmq -e RABBITMQ_DEFAULT_USER username -e RABBITMQ_DEFAULT_PASS password -p 5672:5672 -p 15672:15672 rabbitmq:management #指定默认的用户名和密码
容器备份
docker commit [-m "提交的描述信息"] [-a "创建者"] 容器名称或容器id 生成的镜像名[:标签名] #将容器打包成镜像
docker commit -m "mysql镜像" -a "jiangqiang" mysql mymysql:latest #将名为mysql的容器打包为名为mymysql:latest的镜像
docker inspect --format='{{.Mounts}}' 容器名 #查看是否有挂载目录
只有当没有挂载目录时,才可以使用上面的命令直接打包成镜像。因为如果Docker对容器挂载了数据目录, 在将容器保存为镜像时,数据不会被保存到镜像中。
解决:
- 目录挂载方法。先把在宿主机的数据备份在某个目录下,在 docker run 的时候使用-v参数将宿主机上的目录映射到容器里的目标路径中(tomcat是 /usr/local/tomcat/webapps ,mysql是var/lib/mysql )
- 拷贝方法。先把在宿主机的数据备份在某个目录下,通过拷贝的方法 docker cp 将备份的数据复制进容器里的目标路径中(tomcat是 /usr/local/tomcat/webapps ,mysql是 var/lib/mysql )。
Dockerfile
-
语法规则
- 每条指令的保留字都必须为大写字母且后面至少要有一个参数
- 执行顺序按从上往下执行。
- #用于注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
-
执行流程
- Docker 从基础镜像运行一个容器
- 执行每一条指定并对容器作出修改
- 执行类似 docker commit 的操作提交一个新的镜像层
- docker 再基于刚提交的镜像运行一个新容器
- 执行 Dockerfile 中的下一条指令直到所有指令都执行完成3
-
常用指令
指令(大写的是保留字) | 作用 |
---|---|
FROM image_name:tag | 基础镜像,基于哪个基础镜像启动构建流程 |
MAINTAINER user_name | 镜像的创建者的姓名和邮箱地址等 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果有压缩文件并不能解压 |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是一个压缩文件, 将会在复制后自动解压 |
ENV key value | 设置环境变量 (可以写多条) |
RUN command | 是Dockerfile的核心部分(可以写多条),运行到当前行要执行的其他命令(可想象成sout("aaa") ) |
WORKDIR path_dir | 设置工作目录,当创建容器后,命令终端默认登录进来后所在的目录。未指定则为根目录 / |
EXPOSE port | 当前对外暴露的端口号,使容器内的应用可以通过端口和外界交互 |
CMD argument | Dockerfile中可以有多个CMD,但是只有最后一个会生效。在构建容器时,会被 docker run 后面指定的参数覆盖。 |
ENTRYPOINT argument | 和CMD相似,但是并不会被docker run指定的参数覆盖,而是追加参数 |
VOLUME | 将宿主机文件夹挂载到容器中 |
构建一个jdk镜像
- 在宿主机上创建目录,并切换到新建的目录中
mkdir -p /usr/local/mydocker
cd /usr/local/mydocker
- 下载 jdk-8u111-linux-x64.tar.gz 并上传到服务器(虚拟机)中的/usr/local/mydocker 目录
- 创建Dockerfile文件
vim Dockerfile
#来自基础镜像
FROM centos:7
#指定镜像创建者信息
MAINTAINER suixin
#切换工作目录/usr/local
WORKDIR /usr/local
#创建一个存放jdk的路径
RUN mkdir /usr/local/java
#将jdk压缩包复制并解压到容器中/usr/local/java
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
CMD ["/bin/bash"]
- 构建镜像语法
docker build [-f 指定Dockerfile所在路径与文件名] -t 生成的镜像名:标签名 .
注意后边的空格和点.不要省略, . 表示当前目录
-f 指定Dockerfile文件所在路径与文件名。如果未指定-f值,则找当前目录下名为Dockerfile的构建文件
示例:生成镜像名为jdk,标签为1.8
docker build -t jdk:1.8 . 1
- 查看镜像是否构建完成
docker images
- 创建并运行容器
docker run -it --name=myjdk8 jdk:1.8 /bin/bash