最近很慌的一件事是要在客户的服务器上使用docker容器来部署项目,当时接到这个任务时一脸懵逼,我是谁我在哪;对于还不会docker容器技术的我确实很懵逼,啥也不会;所以最终的结果就是一边学一边部署,从不会到会,到最终上线完成,心情就像是过山车一样,遇到各种问题。好了,废话不多说直接上,这里整理了我在部署时遇到的一些问题,以及在实际部署常用的命令。
docker卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
docker安装
在安装前检查是否有安装gcc和gcc-c++
安装软件包
yum install -y yum-utils
设置阿里云镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包索引
centos7: yum makecache fast
centos8: yum makecache
安装docker
yum -y install docker-ce docker-ce-cli containerd.io
启动docker
systemctl start docker
查看版本号
docker version
docker卸载
停止docker
systemctl stop docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
常用命令
容器:
新建+启动容器
docker run [option] IMAGE [command] [arg...]
option:
--privileged=true 开启权限
--name="容器名称" 为容器指定一个名称
-d 后台运行容器并返回容器ID
-i 以交互模式运行容器,通常与-t结合使用
-t 为容器重新分配一个伪输入终端,通常与-i结合使用
-p 指定端口映射
eg: docker run -it --privileged=true --name mysql -d -p 3308:3306 --restart unless-stopped -v /data/test/mysql/logs:/var/log/mysql -v /data/test/mysql/data:/var/lib/mysql -v /data/test/mysql/conf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.22
查看所有容器
docker ps -a
进入容器 (前两个常用,如果前两个都进不去,使用第三个)
docker exec -it [container_id]/[container_name] /bin/bash
docker exec -it [container_id]/[container_name] bash
docker exec -it [container_id]/[container_name] sh
退出容器
exit run进入容器,exit退出,容器停止
ctrl+p+q run进入容器,ctrl+p+q退出,容器不停止
docker start [container_id]/[container_name] 启动容器
docker stop [container_id]/[container_name] 停止容器
docker restart [container_id]/[container_name] 重启容器
docker kill [container_id]/[container_name] 强制停止容器
docker rm [container_id]/[container_name] 删除已停止的容器
一次性删除多个容器实例
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
查看日志
docker logs [options] [container_id]/[container_name]
options
--detail 显示更多日志详情
-f,--follow 显示实时跟踪日志
--tail=? 显示多少条日志
eg: docker logs -f --tail=300 nginx
查看容器内运行的进程
docker top [container_id]/[container_name]
查看容器内部细节
docker inspect [container_id]/[container_name]
拷贝[复制]文件
docker cp 主机目的文件 [contaiern_id]:容器内的路径
eg: docker cp /data/fuguan/fuguan.sql 7b907e990e0e:/opt/project
导出
docker export [container_id] > 文件名.tar
eg: docker export 7b907e990e0e > xxx.tar
导入
cat 文件名.tar | docker import - 镜像用户/镜像名:镜像版本号
eg: cat abc.tar | docker import - abc/nginx:1.18.0
镜像:
查询某个镜像
docker search [xxxx]
拉取
docker pull 镜像名:版本号
eg: docker pull nginx:1.23.0
查看镜像
docker images
删除镜像
docker rmi 镜像id
eg: docker rmi d4c3cafb11d5
提交镜像
docker commits -m="描述信息" -a="作者" 容器ID要创建的目标镜像名:[标签名]
在连接外网的情况下,安装vim
apt-get update
apt-get -y install vim
创建镜像, 需要结合Dockerfile文件
docker build -t 镜像名 .
eg:docker build -t serve-admin-api .
安装mysql
拉取mysql镜像
docker pull mysql:8.0.22
创建运行容器
docker run -it --privileged=true --name mysql -d -p 3308:3306 --restart unless-stopped -v /data/test/mysql/logs:/var/log/mysql -v /data/test/mysql/data:/var/lib/mysql -v /data/test/mysql/conf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.22
MYSQL_ROOT_PASSWORD 设置MySQL数据库密码
进入MySQL容器
docker exec -it [container_id] /bin/bash
创建数据库
create database topfus_fuguan default character set utf8mb4 collate utf8mb4_unicode_ci;
复制sql文件到数据库容器内
docker cp /data/fuguan/fuguan.sql [container_id]:/
在数据库内执行导入
source fuguan.sql
如果文件是在容器的根目录下直接输入文件名
忘记MySQL数据库root密码
修改root密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'topFus@Guan123';
# 忘记root密码,重置
# 进入容器
docker exec -it [container_id] bash
# 设置跳过权限表的加载
# 警告:这就意味着任何用户都能登录进来,并进行任何操作,相当不安全。
echo "skip-grant-tables" >> /etc/mysql/conf.d/docker.cnf
# 退出容器
exit
# 重启容器
docker restart [container_id]
# 再次进入容器
docker exec -it [container_id] bash
# 登录 mysql(无需密码)
mysql -uroot
# 更新权限
flush privileges;
# 修改密码
alter user 'root'@'localhost' identified by '123456';
# 退出mysql
exit
# 替换掉刚才加的跳过权限表的加载参数
sed -i "s/skip-grant-tables/ /" /etc/mysql/conf.d/docker.cnf
# 退出容器
exit
# 重启容器
docker restart [container_id]
安装Redis
拉取镜像
docker pull redis
创建运行容器
docker run -it --privileged=true --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6399:6379 --name redis -v /data/test/redis/data:/data -v /data/test/redis/conf:/etc/redis/redis.conf -d redis:5.0.14 redis-server /etc/redis/redis.conf --appendonly yes --requirepass 123456
Dockerfile
构建三步骤
1、编写Dockerfile文件
2、docker build 构建镜像
3、docker run 依镜像运行容器实例
基础知识
1、每条保留字指令都必须大写字母且后面至少要跟随一个参数
2、指令按照从上到下,顺序执行
3、#表示注释
4、每条指令都会创建一个新的镜像层并对镜像进行提交
常用指令
FROM 基础镜像,当前镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from
MAINTAINER 镜像维护者的姓名和邮件地址
RUN RUN是在 docker build时运行
EXPOSE 当前容器对外暴露出的端口
WORKDIR 指定在创建容器后,终端默认登录的进来工作目录,一个落脚
USER 指定该镜像以什么样的用户去执行,如果都不指定,默认root
ENV 用来在构建镜像过程中设置镜像变量
ADD 将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包
COPY 类似ADD,拷贝文件和目录到镜像中
VOLUME 容器数据卷,用于数据保存和持久化工作
CMD 指定容器启动后的要干的事情
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换
ENTRYPOINT 指定一个容器启动时要运行的命令
Docker网络
网络模式
bridge 桥接(默认)
host 直接使用宿主机
none 不为docker配置任何网络
container
自定义
查看网络模式
docker newwork ls
查看网络源数据
docker network inspect xxx网络名
删除网络
docker network rm xxx网络名
自定义网络
docker network zzyy_network
docker run -d -p 8081:8080 --network zzyy_network --name tomcat81 billygoo/tomcat8-jdk8
Docker-compose容器编排
官网:https://docs.docker.com/compose/compose-file/compose-file-v3/
安装:
curl -L https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
分配权限
chmod +x /usr/local/bin/docker-compose
查看版本
docker-compose --version
使用Docker-compose.yml文件构建容器
常用命令:
查看帮助
docker-compose -h
启动所有docker-compose服务
docker-compose up
启动所有docker-compose服务并后台运行
docker-compose up -d
停止并删除容器、网络、卷、镜像
docker-compose down
进入容器
docker-compose exec yml里面的服务ID
docker-compose exec yml里面的服务ID /bin/bash
查看所有容器
docker-compose ps
查看进程
docker-compose top
查看容器输出日志
docker-compose logs yml里面的服务ID
检查配置
docker-compose config
检查配置,有问题才输出
docker-compose config -q
重启服务
docker-compose restart
启动服务
docker-compose start
停止服务
docker-compose stop