Docker_1
Docker是一项革命性的容器化技术,于2013年由Docker公司推出。在Docker出现之前,软件部署和运行环境配置是一项复杂且耗时的任务。开发人员需要在不同的系统中进行适配和配置,这导致了“在我的机器上可运行”的问题。传统的虚拟机解决了一部分问题,但它们占用了大量的系统资源,并且启动速度较慢。Docker的诞生解决了这些问题,引领了一场容器化技术的革命。
目录
- 1、Docker命令
- 2、通用命令
- 3、启动各种镜像
- 3.1 docker下的MySql
- 3.2 docker下的Redis
- 3.3 docker下的Tomcat
- 3.4 docker下的rabbitMQ
- 3.5 docker下的elasticsearch
- 3.5.1 拉取失败
- 3.5.2 启动做了端口映射的elasticsearch
- 3.5.2.1 使用-e限制内存启动
- 3.5.2.2 内存足够直接启动
- 3.5.2.2 扩展内存
- 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
- 3.5.2.3.2 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
- 3.5.2.3.3 OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will l
- 3.5.2.3.4 如果启动访问ip:9200没问题,但是测试添加数据返回错误
- 3.6 docker下的zookeeper
- 3.7 docker下的nginx
- 3.8 docker下的centos
- 报错
- docker网络
- 其它
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
过时的方法,废弃,仅供参考
Linux想要安装Docker,centOS的内核版本必须高于3.10。
//Linux终端命令uname -r 查看内核版本
[root@wzw ~]# uname -r
如果版本过低,可以使用命令:yum update 升级软件包及内核在这里插入代码片
[root@wzw ~]# yum update
安装链接:https://www.cnblogs.com/zbseoag/p/11736006.html
- 安装报错
错误containerd.io >= 1.2.2-3
错误:
问题: 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
- 镜像列表
//镜像列表
[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
- 安装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
执行完上面命令以后会提示输入密码,密码成功进入下图所示
然后逐条执行命令
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;
最后使用客户端测试
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)}
使用Desktop工具访问Redis,成功
- 启动失败
查看日志
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镜像版本不符造成的
解决:
- 变更docker版本
- 配置 --privileged=true 启动
docker run -d -p 6379:6379 --privileged=true --name redis redis
3.3 docker下的Tomcat
- 查看镜像
docker search tomcat
- 拉取镜像
docker pull tomcat
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
解决方法:
1、使用docker exec -it 容器id /bin/bash命令进入tomcat目录
[root@wzw ~]# docker exec -it 3c8f31dfb55f /bin/bash
查看目录结构如下
2、将webapps.dist重命名为webapps,原本的webapps改个名字或者删除
3、访问测试
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
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
安装完成后再访问,成功
默认的用户名密码都是guest
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}
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
编辑 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都没用
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 network ls
- 查看网络具体信息
docker network inspect testNet
- 查看容器ip
docker inspect zookeeper1 | grep IPAddress
- 将容器连接到该网络
将zk1容器,连接到名为mynetwork的网络
docker network connect mynetwork zk1
- 将容器从指定网络中移除
将容器kafka1,从mynetwork网络中移除
docker network disconnect mynetwork kafka1
资料:
https://www.qikegu.com/docs/3018
其它
启动的容器没有日志
如果没有指定具体容器的日志路径,可以使用docker查看容器日志
docker logs -f 容器名
方向键和退格键乱码
使用sh进入docker容器,使用方向键和退格键会乱码,
使用/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 /
更多推荐
所有评论(0)