Docker是一个使用Go语言开发的开源的软件容器虚拟化平台,它以容器的形式将应用程序及其所有的依赖打包到一个文件系统,其中包含运行时所需要的一切东西,确保在任何环境都可以运行。
Docker 对比虚拟机
虚拟机 | Docker |
---|---|
创建步骤复杂 | 简单 |
占用资源多 | 占用资源极少 |
启动慢 | 更快的启动速度 |
更好的复用性 |
Docker3个重要概念
- 仓库:用于存放镜像的地方
- 镜像:Docker镜像用于创建容器,Docker镜像是Docker容器的源代码
- 容器:基于镜像运行的虚拟实例,是一系列进程的集合
CentOS系统配置文件存放在/etc/sysconfig/docker。
Docker相关的本地资源存放在/var/lib/docker/目录下,其中container目录存放容器信息,graph目录存放镜像信息,aufs目录下存放具体的镜像底层文件。
一般不推荐在同一个容器内运行多个应用进程。
Docker常用命令
docker *** --help 帮助命令
docker images [-q] 列出本机镜像,只列出镜像ID
docker image COMMAND [image id]
inspect 查看指定镜像的详细信息
history 显示镜像历史信息
build 根据Dockerfile编译镜像
pull 从registry拉取镜像或仓库
push 推送镜像或仓库到registry
rm 删除一个或多个镜像
tag 打标签
docker search *** 从Docker Hub仓库查找镜像
docker pull imageName[:TAG] 从仓库拉取镜像
docker rmi -f imageName 删除某个镜像,-f强制删除
docker rmi docker images -aq 批量删除所有镜像
docker ps [OPTIONS] 列出正在运行的容器
-a 包括已停止的容器
-q 只列出容器ID
docker run [OPTIONS] imageMame 新建并运行容器
--name:为容器指定一个别名,"--name tomcat"
-d:后台运行(注意:Docker容器后台运行,就必须有一个前台进程,否则会自杀)
-i:已交互模式运行容器
-t:为容器重新分配一个伪输入终端
-p:端口映射到宿主机,使外网能访问到该容器(-p 8888:8080 代表容器端口8080映射为宿主机端口8888)
-P:随机端口映射
-e:设置环境变量
-v:挂载宿主主机文件目录到容器内部,(-v /宿主机绝对路径:/容器内路径)
--volumes-from:挂载指定容器的数据卷进行共享,相当于继承的作用
--link:连接某个容器
docker run -d centos /bin/sh -c "while true;do echo hello;sleep 2;done"
exit 容器停止退出
ctrl+P+Q 容器不停止退出
docker attach containerName 重新进入容器终端
docker exec -it containerName /bin/bash
docker exec -t containerID COMMEND 不进入容器对容器执行命令,可以使用 && 拼接多个命令
docker logs -f -t --tail n containerID 查看容器日志
-t:显示时间
-f:实时打印
--tail n:显示最后n行
docker top containerName 显示容器内运行的进程
docker inspect containerName 查看容器内部细节
docker logs containerName 查看容器输出的日志信息
docker cp containerName:容器路径 宿主机路径 拷贝容器内文件到宿主机
docker start containerName 启动容器
docker restart containerName 重启容器
docker stop containerName 停止容器
docker kill containerName 强制停止容器
docker rm containerName 删除容器,可使用docker rm $(docker ps -aq)删除所有
docker build [OPTIONS] PATH | URL | - 基于Dockerfile创建自定义镜像
-f:Dockerfile名称,默认PATH/Dockerfile。不加-f,使用.代表当前路径
-t:指定新镜像名称和可选的TAG。-t name:tag
实例:docker build -t myCentos:1.0 .
上下文路径|URL: 指定构建镜像的上下文的路径,构建镜像的过程中,可以且只可以引用上下文中的任何文件
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] 根据已修改的容器创建一个新的镜像
-a:作者
-m: 提交信息
运行容器基本步骤
1、拉取镜像,docker pull NAME[:TAG]
2、运行容器,docker run [OPTIONS] imageMame
基于Dockerfile文件创建镜像并运行容器基本步骤
1、在指定目录下创建Dockerfile文件
2、基于Dockerfile文件创建自定义镜像 docker build
3、以镜像为模板新建并运行容器 docker run
Dockerfile文件指令:对镜像自定义配置信息,每条指令构建一层
FROM 指定基于哪个基础镜像构建
MAINTAINER 镜像维护者的姓名邮箱
RUN 容器构建时需要执行的命令行,用于创建用户,安装依赖等操作,多条命令使用 && 拼接
EXPOSE 暴露镜像所占用的端口,容器运行时所提供的服务端口
WORKDIR 指定工作目录,容器创建后,终端登录后进入的默认目录
ENV 设置环境变量
COPY 将构建目录上下文中的文件或目录复制到镜像内 COPY ***.tar.gz /user/local
ADD 同COPY,但可以解压tar压缩包,并可以指定通过网络URL下载
CMD 容器启动时要执行的命令,只有最后一行CMD命令生效。容器运行时可以覆盖CMD参数值
ENTYPOINT 同CMD,指定容器中启动程序及参数。但这些参数不能被覆盖
将一台宿主机的docker环境迁移到另外一台宿主机
- 停止Docker服务
- 将整个docker存储文件复制到另外一台宿主机上
- 调整另外一台宿主机的配置即可
Docker 常用容器安装
安装MySQL
- 拉取镜像
docker pull mysql:5.6
- 创建配置文件my.cnf
# 设置UTF-8,避免查询乱码
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
# 增加对emoji表情存储的支持
collation-server=utf8mb4_unicode-ci
character-set-server-utf8mb4
default_password_lifetime=0
# 将时区设置为东八区
default-time-zone='+8:00'
- 启动容器
docker run --name mysqldb -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=mysql \
-e MYSQL_USER=mysql \
-e MYSQL_PASSWORD=mysql \
-e LANG=C.UTF-8 \
-v /usr/local/mydaocker/mysql/logs:/logs \
-v /usr/local/mydaocker/mysql-dockerfile/conf.d/:/etc/mysql/conf.d \
-v /usr/local/mydaocker/mysql-dockerfile/data:/var/lib/mysql \
-v /usr/local/mydaocker/mysql-dockerfile/dumps:/var/lib/dumps\
-d mysql:5.6
进入MySQL容器:docker exec -it mysql /bin/bash
登录MySQL:mysql -uroot -p
创建database:create database db01;
选择database:use db01;
显示所有的库:show databases;
安装Redis
docker pull redis:3.2
docker run -p 6379:6379 -d \
-v/usr/local/mydaocker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/mydaocker/redis/data:/data \
redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
基于Dockerfile创建tomcat镜像示例
- 指定目录下创建Dockerfile文件
FROM centos
#容器维护者信息
MAINTAINER yangxl<1234@qq.com>
#把宿主机当前上下文的文件拷贝到容器路径下
COPY hello.txt /usr/local/helloworld.txt
#把java与Tomcat添加到容器
ADD jdk-8u191-linux-x64.tar.gz /usr/local/java
ADD apache-tomcat-9.0.33.tar.gz /usr/local/tomcat
#安装vim 编辑器
RUN yum -y install vim
#设置工作目录,终端登录后默认路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_191
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
#容器运行时提供的服务端口
EXPOSE 8080
#启动容器时运行Tomcat
# ENTYPOINT ["/usr/local/tomcat/apache-tomcat-9.0.33/bin/startup.sh"]
CMD /usr/local/tomcat/apache-tomcat-9.0.33/bin/startup.sh && tail -F /usr/local/tomcat/apache-tomcat-9.0.33/bin/logs/catalina.out
- 基于Dockerfile创建镜像
docker build -t mytomcat .
- 运行容器
docker run -d -p 8989:8080 --name mytomcat -v /usr/local/mydaocker/tomcat/webapp/test:/usr/local/tomcat/apache-tomcat-9.0.33/webapp/test -v /usr/local/mydaocker/tomcat/logs:/usr/local/tomcat/apache-tomcat-9.0.33/logs mytomcat
安装GitLab
- 查找镜像
docker search gitlab
- 拉取镜像
docker pull gitlab/gitlab-ce
- 创建挂载宿主主机文件目录
# 配置文件
mkdir -p /usr/local/dockerplace/gitlab/etc
# 数据文件
mkdir -p /usr/local/dockerplace/gitlab/log
# 日志文件
mkdir -p /usr/local/dockerplace/gitlab/data
- 创建并启动容器
docker run --publish 8443:443 \
--publish 8090:80 \
--name gitlab \
--privileged=true \
--restart unless-stopped \
-v /usr/local/dockerplace/gitlab/etc:/etc/gitlab \
-v /usr/local/dockerplace/gitlab/log:/var/log/gitlab \
-v /usr/local/dockerplace/gitlab/data:/var/opt/gitlab \
-d gitlab/gitlab-ce:latest
-
修改配置文件
不修改配置文件,无法进行访问
1、修改gitlab.rb
修改 /usr/local/dockerplace/gitlab/etc/gitlab.rb 把external_url改成宿主机的域名或者IP地址
1612171968(1).jpg
2、修改gitlab.yml
修改 /home/gitlab/data/gitlab-rails/etc/gitlab.yml,找到关键字 Web server settings ,将 host 的值改成映射的外部主机 ip 地址和端口
1612173209(1).jpg - 重启一下 gitlab
docker restart gitlab
本地镜像发布到阿里云
1、登录阿里云,搜索容器镜像服务,找到镜像仓库
2、创建命名空间
3、创建镜像仓库,选择本地仓库,可通过命令行推送镜像到镜像仓库
4、将镜像推送到阿里云镜像仓库
5、将镜像推送到Registry
docker login --username=飞啊飞你的困难 registry.cn-beijing.aliyuncs.com
docker tag [ImageId] registry.cn-beijing.aliyuncs.com/yangxl/my-mysql:[镜像版本号]
docker push registry.cn-beijing.aliyuncs.com/yangxl/my-mysql:[镜像版本号]
从阿里云镜像仓库拉取镜像
1、登录阿里云Docker Registry
docker login --username=飞啊飞你的困难 registry.cn-beijing.aliyuncs.com
2.、从Registry中拉取镜像
docker pull registry.cn-beijing.aliyuncs.com/yangxl/repoName:[镜像版本号]