Docker在Linux环境下常见部署
Docker是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。使用Docker可以更方便地打包、测试以及部署应用程序。
Docker安装
安装yum-utils
1
| yum install -y yum-utils device-mapper-persistent-data lvm2
|
为yum源添加docker仓库位置
1
| yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
安装Docker
启动Docker
自启动Docker
查看Docker版本
查看Docker信息
查看Docker帮助
查看Docker状态
配置Docker镜像加速器
1 2 3 4 5 6 7 8
| sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://fsfhxt97.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
|
重启Docker
1
| systemctl restart docker
|
防火墙配置
默认情况下,当docker启动容器映射端口时,会直接使用iptables开启添加端口
查看防火墙状态
1
| systemctl status firewalld
|
重启防火墙
1
| systemctl restart firewalld
|
自启防火墙
1
| systemctl enable firewalld
|
查看开放端口
1
| firewall-cmd --list-port
|
开放端口
1
| firewall-cmd --zone=public --add-port=80/tcp --permanent
|
重载防火墙
Docker命令
Docker镜像常用命令
搜索镜像
下载镜像
查看镜像版本
docker search命令只能查找出是否存在该镜像,不能找到该镜像支持的版本,所以我们需要docker hub官网来搜索支持的版本
查看镜像
删除镜像
强制删除指定名称镜像
删除所有没有使用的镜像
1
| docker rmi `docker images | grep none | awk '{print $3}'`
|
强制删除所有镜像
1
| docker rmi -f $(docker iamges)
|
打包镜像
1 2
| # -t 表示指定:镜像仓库名称/镜像名称:镜像标签 .表示使用当前目录下的dockerfile文件 docker build -t ${group_name}/${app_name}:${app_version} .
|
推送镜像
1 2 3 4 5 6
| # 登录Docker hub docker login # 将本地镜像标签为远程仓库名称 docker tag ${group_name}/${app_name}:${app_version} ${docker_group_name}/${app_name}:${app_version} # 推送远程仓库 docker push ${docker_group_name}/${app_name}:${app_version}
|
Docker容器常用命令
新建并启动容器
1 2 3 4
| docker run -p 80:80 --name nginx \ -e TZ="Asia/Shanghai" \ -v /mydata/nginx/html:/usr/share/nginx/html \ -d nginx:1.17.0
|
- -p:将宿主机和容器端口进行映射,格式为:宿主机端口:容器端口
- –name:指定容器名称,可以通过容器名称来操作容器
- -e:设置容器的环境变量,TZ设置的是时区
- -v:将容器上的文件挂载到宿主机上,格式为:宿主机文件目录:容器文件目录
- -d:容器以后台方式运行
列出容器
列出运行中的容器
列出所有容器
停止容器
1 2 3
| # $ContainerName表示容器名称,$ContainerId表示容器ID, docker stop $ContainerName (or docker stop $ContainerId)
|
强制停止容器
1
| docker kill $ContainerName
|
启动容器
1
| docker start $ContainerName
|
重启容器
1
| docker restart $ContainerName
|
进入容器
查询容器的pid:
1
| docker inspect -f "{{.State.Pid}}" $ContainerName
|
根据容器的pid进入容器:
1
| nsenter -t "$pid" --mount --uts --ipc --net --pid
|
删除容器
删除指定容器
1
| docker rm $ContainerName
|
强制删除指定容器
1
| docker rm -f $ContainerName
|
按名称通配符删除容器
删除以名称demo-开头的容器
1
| docker rm `docker ps -a | grep demo-* | awk '{print $1}'`
|
强制删除所有容器
1
| docker rm -f ${docker ps -a -q}
|
查看容器日志
查看容器产生的全部日志
1
| docker logs $ContainerName
|
动态查看容器的日志
1
| docker logs -f $ContainerName
|
查看容器IP地址
1
| docker inspect -f '{{.NetworkSettings.IPAddress}}' $ContainerName
|
修改容器的启动方式
1 2
| # 将容器启动方式修改为always docker container update --restart=always $ContainerName
|
同步宿主机时间到容器
1
| docker cp /etc/localtime $ContainerName:/etc/
|
查看容器资源占用状态
查看指定容器资源占用状态,比如cpu、内存、网络、io状态
1
| docker stats $ContainerName
|
查看所有容器资源占用情况
查看容器磁盘使用情况
执行容器内部命令
1
| docker exec -it $ContainerName /bin/bash
|
指定账号进入容器内部
1 2
| # 使用root账号进入容器内部 docker exec -it --user root $ContainerName /bin/bash
|
查看所有网络
创建外部网络
1
| docker network create -d bridge my-bridge-network
|
指定容器网络
1 2 3
| docker run -p 80:80 --name nginx \ --network my-bridge-network \ -d nginx
|
修改镜像存放位置
查看Docker镜像的存放位置
1
| docker info | grep "Docker Root Dir"
|
关闭Docker服务
移动原镜像文件至目标目录
1
| mv /var/lib/docker /mydata/docker
|
建立软连接
1
| ln -s /mydata/docker /var/lib/docker
|
Docker容器清理
查看Docker占用磁盘空间情况
删除所有关闭的容器
1
| docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
|
删除所有虚悬(dangling)镜像(没有Tag的镜像)
1
| docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
|
删除所有虚悬(dangling)数据卷
1
| docker volume rm $(docker volume ls -qf dangling=true)
|
Docker容器安装
MySQL安装
拉取MySQL镜像
运行MySQL容器
1 2 3 4 5 6 7
| docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/data:/var/lib/mysql \ -v /mydata/mysql/conf:/etc/mysql \ -v /mydata/mysql/log:/var/log/mysql \ -e MYSQL_ROOT_PASSWORD=root \ --restart=always \ -d mysql
|
运行MySQL的docker容器
1
| docker exec -it mysql /bin/bash
|
打开MySQL客户端
1
| mysql -uroot -proot --default-character-set=utf8
|
创建一个账号并修改权限
1
| grant all privileges on *.* to 'reader'@'%' identified by '123456';
|
创建数据库
1 2 3 4 5 6 7 8 9
| # 创建数据库 create datebase ${dabebase} character set utf8 # 安装上传下载插件并将sql文件上传到Linux服务器中的/mydata目录 yum -y install lrzsz # 拷贝sql文件至mysql容器 docker cp /mydata/*.sql mysql:/ # 将sql文件导入数据库 use ${dabebase} source /*.sql
|
Redis安装
拉取Redis镜像
运行Redis容器
1 2 3 4
| docker run -p 6379:6379 --name redis \ -v /mydata/redis/data:/data \ --restart=always \ -d redis redis-server --appendonly yes --requirepass "root"
|
进入Redis容器
1 2 3 4
| docker exec -it redis /bin/bash redis-cli auth root # 或者 docker exec -it redis redis-cli
|
Nginx安装
拉取Nginx镜像
运行Nginx容器
1 2 3 4
| docker run -p 80:80 --name nginx \ -v /mydata/nginx/html:/usr/share/nginx/html \ -v /mydata/nginx/logs:/var/log/nginx \ -d nginx
|
拷贝配置文件至指定目录
1
| docker container cp nginx:/etc/nginx /mydata/nginx/
|
修复文件名称
1 2
| cd /mydata/nginx/ mv nginx conf
|
销毁容器
运行Nginx容器
1 2 3 4 5 6 7
| docker run -p 80:80 --name nginx \ -v /mydata/nginx/html:/usr/share/nginx/html \ -v /mydata/nginx/logs:/var/log/nginx \ -v /mydata/nginx/conf:/etc/nginx \ -v /home/apps/home/apps \ --restart=always \ -d nginx
|
Jenkins安装
拉取Jenkins镜像
1
| docker pull jenkins/jenkins
|
运行Jenkins容器
1 2 3 4 5 6
| docker run --name jenkins \ -p 8090:8080 -p 50000:5000 \ -u root \ -v /mydata/jenkins_home:/var/jenkins_home \ --restart=always \ -d jenkins/jenkins
|
RabbitMQ安装
拉取RabbitMQ镜像
1
| docker pull rabbitmq:3.9-management
|
创建用于挂载目录并修改权限
1 2
| mkdir -p /mydata/rabbitmq/{data,conf,log,plugins} chmod -p 777 /mydata/rabbitmq
|
运行RabbitMQ容器
1 2
| docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \ -d rabbitmq:3.9-management
|
复制文件到宿主机
1 2
| docker cp rabbitmq:/etc/rabbitmq/ /mydata/rabbitmq/conf docker cp rabbitmq:/opt/rabbitmq/plugins /mydata/rabbitmq/
|
强制删除容器
重新运行容器
1 2 3
| docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \ -v /mydata/rabbitmq/plugins:/plugins \ -d rabbitmq:3.9-management
|
Dockerfile
使用DockerFile来构建docker镜像
Dockerfile常见命令
FROM
指定所需依赖的基础镜像
1 2 3
| FROM <image>:<tag> # 该镜像需要依赖的java8的镜像 FROM java:8
|
ADD
用于复制文件
1 2 3
| ADD <src> <dest> # 将当前目录下的demo.jar包复制到docker容器的/目录下 ADD demo.jar /demo.jar
|
RUN
在容器构建过程中执行的命令,我们可以用该命令自定义容器的行为,比如安装一些软件,创建一些文件等
1 2 3 4
| RUN <command> RUN ["executable", "param1","param2"...] # 在容器构建过程中需要在/目录下创建一个demo.jar文件 RUN bash -c 'touch /demo.jar'
|
EXPOSE
声明需要暴露的端口(只声明不打开端口)
1 2 3
| EXPOSE <port1> <port2> ... # 声明服务运行在8080端口 EXPOSE 8080
|
ENV
用于设置环境变量
1 2 3
| ENV <key> <value> # mysql运行时设置root密码 ENV MYSQL_ROOT_PASSWORD root
|
ENTRYPOINT
指定docker容器启动时执行的命令
1 2 3
| ENTRYPOINT ["executable", "param1","param2"...] # 指定docker容器启动时运行jar包 ENTRYPOINT ["java","-jar","/demo.jar"]
|
MAINTAINER
指定维护者的名字
1 2
| MAINTAINER <name> MAINTAINER xiaoyuanjw
|
构建应用镜像
1 2 3 4 5 6 7 8 9 10 11 12
| # 该镜像需要依赖的基础镜像 FROM java:8 # 将当前目录下的jar包复制到docker容器的/目录下 ADD demo.jar /demo.jar # 运行过程中创建一个demo.jar文件 RUN bash -c 'touch /demo.jar' # 声明服务运行在8080端口 EXPOSE 8080 # 指定docker容器启动时运行jar包 ENTRYPOINT ["java", "-jar","/demo.jar"] # 指定维护者的名字 MAINTAINER xiaoyuanjw
|
Docker Compose
Docker Compose安装
下载Docker Compose
1
| curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
|
修改文件权限可执行
1
| chmod +x /usr/local/bin/docker-compose
|
查看是否已经安装成功
1
| docker-compose --version
|
Docker Compose步骤
- 使用Dockerfile定义应用程序环境,一般需要修改初始镜像行为时才需要使用
- 使用Docker-Compose.yml定义需要部署到应用程序以便执行脚本一次性部署
- 使用Docker-Compose up命令将所有的应用服务一次性部署起来
Docker-compose.yml常见命令
image
指定运行的镜像名称
container_name
配置容器名称
ports
指定宿主机和容器的端口映射(HOST:CONTAINER)
volumes
将宿主机的文件或目录挂载到容器中(HOST:CONTAINER)
1 2 3 4 5
| volumes: - /mydata/mysql/log:/var/log/mysql - /mydata/mysql/data:/var/lib/mysql - /mydata/mysql/conf:/etc/mysql
|
environment
配置环境变量
1 2 3
| environment: - MYSQL_ROOT_PASSWORD=root
|
links
连接其他容器的服务(SERVICE:ALIAS)
Docker Compose常见命令
构建、创建和启动相关服务
指定文件启动
1
| docker-compose -f docker-compose.yml up -d
|
停止所有相关容器
列出所有容器信息列出所有容器信息