docker介绍https://mp.weixin.qq.com/s/R1Z5jvmw0SwggzpRhBI1Lg

1、Docker命令

1.1 安装Docker

  • 如果安装过先卸载 往下翻有卸载方法
  • 安装依赖设置yum仓库
    安装依赖:
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

设置仓库:

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  • 安装docker
yum install docker-ce docker-ce-cli containerd.io
  • 验证是否安装成功
docker version

Docker_1_docker

过时的方法,废弃,仅供参考

Linux想要安装Docker,centOS的内核版本必须高于3.10。

//Linux终端命令uname -r 查看内核版本
[root@wzw ~]# uname -r

Docker_1_linux_02

如果版本过低,可以使用命令:yum update 升级软件包及内核在这里插入代码片

[root@wzw ~]# yum update

安装链接:https://www.cnblogs.com/zbseoag/p/11736006.html

错误:
 问题: package docker-ce-3:19.03.12-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
  - cannot install the best candidate for the job
  - package containerd.io-1.2.10-3.2.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.13-3.1.el7.x86_64 is filtered out by modular filtering
  - package containerd.io-1.2.13-3.2.el7.x86_64 is filtered out by modular filtering

报以上错误执行这一句

yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm

错误:file /usr/share/man/man1/docker

下载的软件包保存在缓存中,直到下次成功执行事务。
您可以通过执行 'yum clean packages' 删除软件包缓存。
错误:Transaction test error:
  file /usr/share/man/man1/docker-attach.1.gz from install of docker-ce-cli-1:19.03.12-3.el7.x86_64 conflicts with file from package podman-manpages-1.4.2-5.module_el8.1.0+237+63e26edc.noarch
  file /usr/share/man/man1/docker-build.1.gz from install of docker-ce-cli-1:19.03.12-3.el7.x86_64 conflicts with file from package podman-manpages-1.4.2-5.module_el8.1.0+237+63e26edc.noarch
  file /usr/share/man/man1/docker-commit.1.gz from install of docker-ce-cli-1:19.03.12-3.el7.x86_64 conflicts with file from package podman-manpages-1.4.2-5.module_el8.1.0+237+63e26edc.noarch
  file /usr/share/man/man1/docker-container-prune.1.gz from install of docker-ce-cli-1:19.03.12-3.el7.x86_64 conflicts with file from package podman-manpages-1.4.2-5.module_el8.1.0+237+63e26edc.noarch

以上错误执行以下这一句,

yum  remove podman-manpages -y

然后再继续安装yum install docker-ce

1.2 启动Docker

[root@wzw ~]# systemctl start docker

1.3 查看Docker版本

[root@wzw ~]# docker -v

1.4 重启Docker服务

[root@wzw ~]# systemctl restart  docker
//或者
[root@wzw ~]# sudo service docker restart

1.5 守护进程重启

[root@wzw ~]# sudo systemctl daemon-reload

1.6 关闭Docker

[root@wzw ~]# service docker stop 
//或者
[root@wzw ~]# systemctl stop docker

1.7 查看Docker运行状态

[root@localhost ~]# systemctl status docker

1.8 干净的卸载docker

共四条命令,一条一条执行

//1、
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
 //2、
rm -rf /etc/systemd/system/docker.service.d
 //3、
rm -rf /var/lib/docker
 //4、
rm -rf /var/run/docker

2、通用命令

2.1 镜像操作

如果pull太慢,尝试该方法:https://blog.csdn.net/julien71/article/details/79760919

  • 查找镜像
//查找镜像
[root@wzw ~]# docker search 镜像名
  • 拉取镜像
//拉取镜像
[root@wzw ~]# docker pull 镜像名

太长的话DESCRIPTION显示不完整,想要看完整的DESCRIPTION,加上参数--no-trunc

Docker_1_docker_03

  • 镜像列表
//镜像列表
[root@wzw ~]# docker images
  • 删除镜像
//删除镜像
[root@wzw ~]# docker rmi 镜像id

2.2 容器操作

//把docker中的/etc/resolv.conf的文件拷贝到linux中的/data/中
sudo docker cp mytomcat1:/etc/resolv.conf /data/
//根据镜像启动容器
[root@wzw ~]# docker run --name 容器名称-d 镜像模板
//查看正在运行的容器
[root@wzw ~]# docker ps
//查看所有的容器,包括停止的
[root@wzw ~]# docker ps -a
//停止运行中的容器
[root@wzw ~]# docker stop 镜像id或镜像名称
//启动停止的容器
[root@wzw ~]# docker start 镜像id或镜像名称
//重启容器
[root@wzw ~]# docker restart 镜像id或镜像名称
//删除容器
[root@wzw ~]# docker rm 容器id或名称
//查看docker启动容器日志
docker logs 容器名
//查看docker容器实时日志
docker logs -f 容器名

  以上的启动的容器都只是内部的,想要能访问到,像tomcat和mysql,要做端口映射。

2.2.1 docker操作

新创建的docker容器没有很多命令,需要安装

2.2.2 安装vim

使用docker exec -it 3c8f31dfb55f /bin/bash进入docker容器以后,是不能使用vim命令,使用以下命令,就可以使用vim编辑文件 更新来源

apt-get update

安装vim

apt-get install -y vim

从linux拷贝文件到docker

//复制当前目录的sources.list到mytomcat1这个容器的/etc/apt/下
docker cp sources.list mytomcat1:/etc/apt/

2.2.3 安装ifconfig

  1. 安装ifconfig命令
[root@03b03bc1c105 /]# yum search ifconfig
[root@03b03bc1c105 /]# yum install net-tools.x86_64

2.2.4 安装rz、sz

进入docker容器后执行

apt-get update && apt-get install lrzsz

2.2.5 同步时间

进入docker容器后

apt-get install ntpdate

2.2.6 apt-get速度很慢

sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list

apt-get clean

apt-get update

apt-get upgrade

3、启动各种镜像

  3.1 docker下的MySql

   3.1.1 启动端口映射的MySql

mysql不太一样,要设置账号密码-e MYSQL_ROOT_PASSWORD=123456

//启动做了端口映射的MySql
[root@wzw ~]# docker run -p 3306:3306 --name mysql02 -e MYSQL_ROOT_PASSWORD=123456 -d mysql

   3.1.2 远程连接MySql报错1251

  如果数据库连接报错1251,是远程连接没有授权,可以按照以下步骤开通权限。 首先进入容器

[root@wzw ~]# docker exec -it 容器id bash
//示例
[root@wzw ~]# docker exec -it ae00d8bf9439 bash

进入容器以后,进入数据库

//进入容器中的数据库
root@ae00d8bf9439:/# mysql -uroot -p

执行完上面命令以后会提示输入密码,密码成功进入下图所示

Docker_1_linux_04

然后逐条执行命令

1、对远程连接授权

mysql> GRANT ALL ON *.* TO 'root'@'%';

2、更改密码的加密规则

mysql> ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

3、更改root的密码

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

4、刷新权限

mysql> flush privileges;

最后使用客户端测试

Docker_1_docker_05

  3.2 docker下的Redis

首先同样拉取Redis

docker pull redis

然后启动做了端口映射的redis

docker run -d -p 6379:6379 --name myredis redis
docker exec -it 容器id redis-cli -h 虚拟机的 -p Redis端口号(默认都是6379)}

Docker_1_docker_06

使用Desktop工具访问Redis,成功

Docker_1_tomcat_07

  • 启动失败查看日志
C:\Users\w4523>docker logs redis
1:C 14 Aug 2024 01:27:27.618 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:C 14 Aug 2024 01:27:27.619 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 14 Aug 2024 01:27:27.619 * Redis version=7.4.0, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 14 Aug 2024 01:27:27.619 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
1:M 14 Aug 2024 01:27:27.619 * monotonic clock: POSIX clock_gettime
1:M 14 Aug 2024 01:27:27.619 * Running mode=standalone, port=6379.
1:M 14 Aug 2024 01:27:27.619 # Fatal: Can't initialize Background Jobs. Error message: Operation not permitted

原因:docker版本和redis镜像版本不符造成的解决:

  1. 变更docker版本
  2. 配置 --privileged=true 启动
docker run -d -p 6379:6379 --privileged=true --name redis redis

  3.3 docker下的Tomcat

  • 查看镜像
docker search tomcat

Docker_1_linux_08

  • 拉取镜像
docker pull tomcat

Docker_1_tomcat_09

   3.3.1 启动做了端口映射的tomcat

//随机名字
[root@wzw~]# docker run -d -p 8888:8080 tomcat
//指定名字为mytomcat1
[root@localhost ~]# docker run --name mytomcat1 -d -p 8081:8080 tomcat

   3.3.2 访问失败,404

Docker_1_docker_10

解决方法: 1、使用docker exec -it 容器id /bin/bash命令进入tomcat目录

[root@wzw ~]# docker exec -it 3c8f31dfb55f /bin/bash

查看目录结构如下

Docker_1_docker_11

2、将webapps.dist重命名为webapps,原本的webapps改个名字或者删除 3、访问测试

Docker_1_tomcat_12

4、把war包放到tomcat中

docker exec -it tomcat1 /bin/bash
//docker cp 本地位置 docker的tomcat名:/usr/local/tomcat/webapps
  docker cp /usr/local/web/test.war tomcat1:/usr/local/tomcat/webapps

3.3.3 查看实时控制台日志

docker logs --tail=100 -f 容器名称

//docker logs --tail=100 -f 容器名称
[root@aubin test]# docker logs --tail=100 -f mytomcat1
//等同于tail -100f catalina.out

  3.4 docker下的rabbitMQ

   3.4.1启动

拉取rabbitMQ

[root@wzw ~]# docker pull rabbitmq

启动端口映射的rabbitmq

[root@wzw ~]# docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq 2b5cda43d345

Docker_1_redis_13

   3.4.2访问不到主页

无法访问主页,百度了别人的方法,解决了,原因是缺少插件参考地址:https://www.cnblogs.com/yuebo/p/11732769.html运行命令[root@wzw ~]# docker exec -it myrabbitmq sh进入容器

[root@wzw ~]# docker exec -it myrabbitmq sh
rabbitmq-plugins enable rabbitmq_management

Docker_1_docker_14

安装完成后再访问,成功

Docker_1_tomcat_15

默认的用户名密码都是guest

Docker_1_linux_16

   3.4.3 管理界面没有折线图

#进入rabbitmq容器
docker exec -it {rabbitmq容器名称或者id} /bin/bash
 
#进入容器后,cd到以下路径
cd /etc/rabbitmq/conf.d/
 
#修改 management_agent.disable_metrics_collector = false
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
 
#退出容器
exit
 
#重启rabbitmq容器
docker restart {rabbitmq容器id}

Docker_1_docker_17

   3.4.4 Failed to create thread: Operation not permitted (1)

容器中的进程尝试执行需要特权的操作而引起的,使用--privileged标志启动容器

docker run --privileged -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq

  3.5 docker下的elasticsearch

  3.5.1 拉取失败

  一般来说,直接docker pull 镜像id就可以了,但是elasticsearch需要指定版本号,如果不指定就会报错not found

docker pull elasticsearch:7.5.2

  3.5.2 启动做了端口映射的elasticsearch

  elasticsearc是用Java写的,初始默认占用2G的内存空间,使用-e命令限制它的内存使用,否则内存空间不足的话要报错。

   3.5.2.1 使用-e限制内存启动

-Xms256m:初始的内存大小256m-Xmx256m:最大的内存大小256m

[root@wzw ~]# docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name ES01 929d271f1798
   3.5.2.2 内存足够直接启动

  内存足够大的话就不用限制它的内存大小,直接启动。

[root@wzw ~]# docker run -d -p 9200:9200 -p 9300:9300 --name ES01 929d271f1798
   3.5.2.2 扩展内存

  如果又不想限制内存启动,又想直接启动,可以扩展自己的虚拟机,参考:linux扩展内存

   3.5.2.3 异常:启动等一下就退出
   3.5.2.3.1 the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

  这个错误是说[discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] 这三项,必须得设置其中一项,这里就设置discovery.seed_hosts进入容器

[root@wzw ~]# docker exec -it 590ef4e1a968 bash

找到config

Docker_1_redis_18

编辑 elasticsearch.yml

[root@590ef4e1a968 config]# vi elasticsearch.yml

添加以下内容

discovery.seed_hosts: ["127.0.0.1", "[::1]"]

解决完成

   3.5.2.3.2 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

   这个错误是内存太小,至少是262144,这里解决的话就是修改配置文件使用root用户,然后修改配置sysctl.conf

[root@wzw ~]# vi /etc/sysctl.conf

在文件中添加vm.max_map_count=655360添加完成保存退出执行 [root@wzw ~]# sysctl -p然后重启ES,解决完成

   3.5.2.3.3 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will l

进入es容器,修改config中的jvm.options,将 -XX:+UseConcMarkSweepGC 改为 -XX:+UseG1GC,并重启es。

   3.5.2.3.4 如果启动访问ip:9200没问题,但是测试添加数据返回错误

   应该是docker默认的配置文件没有设置,给它填点配置

#开启跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
 
#节点名称
node.name: "node-1"
#节点ip 单机默认回环地址 集群必须绑定真实ip
network.host: 0.0.0.0
#集群名称
cluster.name: my-application
#初始化选举的节点名称
cluster.initial_master_nodes: ["node-1"]
#用于发现其他节点 格式host:port
discovery.seed_hosts: ["127.0.0.1:9200"]

以上这些配置写在容器中的config文件夹下的elasticsearch.yml中基本就可以测试添加了

  3.6 docker下的zookeeper

拉取zookeeper

docker pull zookeeper

启动做了端口映射的zookeeper

[root@wzw ~]# docker run --name zk01 -p 2181:2181 --restart always -d 2e30cac00aca

不带日志的启动

docker exec -it 容器id zkCli.sh

启动并显示日志./zkServer.sh start-foreground

root@9abf402fb481:/apache-zookeeper-3.6.1-bin/bin# ./zkServer.sh start-foreground

  3.7 docker下的nginx

拉取nginx

[root@localhost sbin]# docker pull nginx

启动nginx

[root@localhost sbin]# docker run --name nginx -p 80:80 -d nginx

修改配置文件

//进入容器
[root@localhost sbin]# docker exec -it nginx bash

  3.8 docker下的centos

拉取centos

[root@localhost ~]# docker pull centos

启动centos

[root@localhost ~]# docker run --name 起一个容器名称 -d -i -t 要启动的容器 /bin/bash
[root@localhost ~]# docker run --name centos1 -d -i -t centos /bin/bash

启动centos不带--privileged的话,执行systemctl命令报错System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

[root@localhost ~]# docker run -itd   --privileged --name 起的容器名称 容器名 /usr/sbin/init
[root@localhost ~]# docker run -it -p 50001:22 --privileged --name centos centos /usr/sbin/init

如果提示:Unit firewalld.service could not be found. 说明防火墙没有安装,需要安装。yum install firewalld firewall-config

报错

CentOS8的docker网络有问题apt-get update用不了,报错,前一天都可以用,后来都用不了,ping也不通,研究了很久,网上的各种改源或者改配置文件都没用,估计虚拟机原本用的桥接的方式,docker创建容器默认也用的是桥接的方式。后来可能因为不正常的关闭虚拟机出了问题,也没人请教,最后都没解决.重装VMware,docker都没用

Docker_1_docker_19

root@3d2cd1c65eab:/usr/local/tomcat# apt-get update
Err:1 http://security.debian.org/debian-security buster/updates InRelease
  Temporary failure resolving 'security.debian.org'
Err:2 http://deb.debian.org/debian buster InRelease
  Temporary failure resolving 'deb.debian.org'
Err:3 http://deb.debian.org/debian buster-updates InRelease
  Temporary failure resolving 'deb.debian.org'
Reading package lists... Done
W: Failed to fetch http://deb.debian.org/debian/dists/buster/InRelease  Temporary failure resolving 'deb.debian.org'
W: Failed to fetch http://security.debian.org/debian-security/dists/buster/updates/InRelease  Temporary failure resolving 'security.debian.org'
W: Failed to fetch http://deb.debian.org/debian/dists/buster-updates/InRelease  Temporary failure resolving 'deb.debian.org'
W: Some index files failed to download. They have been ignored, or old ones used instead.

方法一

只能删除创建好的容器,再重新创建容器,创建容器的时候带上指定的网络参数,就可以使用apt-get update了,但是端口号就有问题了,

//创建容器的时候指定容器的网络
docker run -it --name test --net=host tomcat
docker run -it --name 给容器起的名称 --net=host 容器类型

方法二

参考:https://www.jianshu.com/p/6481842a96e6依次执行命令

//1、
firewall-cmd --zone=public --add-masquerade --permanent
//2、
firewall-cmd --reload
//3、
systemctl restart docker

好用,有效

docker网络

  • 创建网络
docker network create --subnet 192.168.0.1/24 testNet

Docker_1_docker_20

  • 查看网络列表
docker network ls

Docker_1_tomcat_21

  • 查看网络具体信息
docker network inspect testNet

Docker_1_docker_22

  • 查看容器ip
docker inspect zookeeper1 | grep IPAddress

Docker_1_docker_23

  • 将容器连接到该网络将zk1容器,连接到名为mynetwork的网络
docker network connect mynetwork zk1
  • 将容器从指定网络中移除将容器kafka1,从mynetwork网络中移除
docker network disconnect mynetwork kafka1

资料:https://www.qikegu.com/docs/3018

其它

方向键和退格键乱码

使用sh进入docker容器,使用方向键和退格键会乱码,

Docker_1_tomcat_24

使用/bin/bash就可以了

将文件从docker容器中拿出来

docker cp [容器ID或名称]:[容器内文件路径] [宿主机文件路径]

docker cp myredis:/etc/apt/sources.list /usr/local/download/

将宿主机器的文件放入到docker容器中

docker cp [宿主机文件路径] [容器ID或名称]:[容器内文件路径]

docker cp sources.list myJenkins:/etc/apt/

不进入容器,查看容器内的目录

docker exec -it myGitLab ls /

Docker_1_docker_25