docker book
主页
docker是一个开源的应用容器引擎, 它的性能要高于虚拟机.
docker官方查找应用: https://hub.docker.com/
docker的各元素概念
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);
docker客户端(Client):连接docker主机进行操作;
docker仓库(Registry):用来保存各种打包好的软件镜像;
docker镜像(Images):软件打包好的镜像;放在docker仓库中;
docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用
Docker使用步骤
1)、安装Docker
2)、去Docker仓库找到这个软件对应的镜像;
3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;
安装Docker
前奏,安装虚拟机
1) 先在virtualbox中安装linux虚拟机
安装时使用: 桥接网络->选好网卡-->高级-->接入网线;
设置好网络以后使用命令重启虚拟机的网络
service network restart
2)、查看linux的ip地址 : ip addr
3)、使用客户端连接linux;
虚拟机上安装Docker
#1、检查内核版本,必须是3.10及以上 uname -r #2、安装docker yum install docker #3、输入y确认安装 #4、开机启动docker systemctl enable docker Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. #5、启动docker systemctl start docker docker -v Docker version 1.12.6, build 3e8e77d/1.12.6 #6、停止docker systemctl stop docker
使用docker镜像中国
由于国外下载源特别慢,可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值,让之后的所有下载源从国内镜像下载
$ vim /etc/docker/daemon.json { "registry-mirrors": ["https://registry.docker-cn.com"] }
或者换上阿里云的镜像: https://xxxxxx.mirror.aliyuncs.com , 登录 https://cr.console.aliyun.com/cn-qingdao/instances/mirrors配置
更新配置,重启docker
systemctl daemon-reload
systemctl restart docker
参考 docker 中国官方镜像加速==https://www.cnblogs.com/weifeng1463/p/7468391.html
添加阿里云docker镜像
目前阿里云docker镜像是免费的 ,登录"阿里云容器镜像服务"控制台后,按提示执行以下命令就行了
Docker 配置文件位置
Docker 的配置文件可以设置大部分的后台进程参数
在 ubuntu 中配置文件位置是:/etc/default/docker
在 centos 中配置文件的位置是:/etc/sysconfig/docker
查看镜像、容器、数据卷所占用的空间
docker system df
4、Docker常用命令&操作
docker 镜象官网地址 https://hub.docker.com/search?q=&type=image
1)、镜像操作
操作 | 命令 | 样例 | 说明 |
---|---|---|---|
检索 | docker search 关键字 eg:docker search redis | docker search tomcat | 我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。 |
拉取 | docker pull 镜像名:tag | docker pull tomcat:latest | :tag是可选的,tag表示标签,多为软件的版本,默认是latest |
列表 | docker images | docker images | 查看所有本地镜像 |
删除 | docker rmi image-id | docker rmi 5a069ba3df4d | 删除指定的本地镜像 |
2)、容器操作
为了演示简单, 先关闭防火墙.
#查看防火墙状态 service firewalld status #关闭防火墙 service firewalld stop
在使用docker过程中最容易搞混的是 镜像 和 容器 , 这两个概念,它们之间的关系正如:
软件镜像(QQ安装程序)----> 运行镜像----> 产生一个容器(正在运行或已经关闭的QQ);
操作 | 命令 | 样例 | 说明 |
---|---|---|---|
运行容器 | docker run --name 自定义容器名 -d 镜像名:tag | docker run --name mytomcat -d tomcat:latest | 根据镜像启动容器 , -d意为以daemon后台守护进程的方式启动 |
运行容器(指定端口映射) | docker run --name mytomcat -d -p 8888:8080 tomcat |
#-d:后台运行 关于端口映射问题 , |
|
查看运行中的容器 | docker ps | docker ps | |
查看所有容器(运行和非运行) | docker ps -a | docker ps -a | 超高频使用,可查看之前运行过的所有容器 |
再次启动运行过的容器 | docker start container_id/container_name | docker start mytomcat | |
停止容器 | docker stop 容器的id | docker stop a52reqr | |
停止并移除 | docker rm -f 容器id | docker rm -f a52re2 | |
查看容器日志 | docker logs container-name或者container-id | docker logs mytomcat | 查看容器的日志 |
docker-compose | docker-compose up |
根据当前目录下docker-compse.yml配置文件启动docker服务 , 参数直接在yml文件中预写好, 无须像docker run 那样指定写一堆参数 |
3)、docker-compse命令
最基本的使用,进入到有 docker-compose.yml文件的目录, 执行 docker-compose up 启动docker 服务.
docker-compose -f prod-nginx.yml up -d 以 -f 指定配置文件 , 并且用 -d 指定后台模式启动
docker-network认识==>https://blog.csdn.net/weixin_43157543/article/details/128408433
docker-compose 网络配置 docker network配置 转载==>https://blog.51cto.com/u_14230/6661827
指定 host 网络模式
version: '3'
services:
your-service:
image: your-image
network_mode: host
特殊说明
容器随docker启动而启动
容器启动前使用(低频) docker run --restart=always --name mytomcat -d -p 8888:8080 tomcat
容器启动后使用(高频) docker update --restart=always <containerName>
docker rm container-name或者container-id
这里的container-name要注意不是tomcat, 而是启动时候指定的name。
如果用命令docker ps -a查看已启动过的容器的话, 那就是最后一列的名字, 另外如果启动时没有指定docker run --name specifiedName ,那么docker会随机命名一个比如competent_lumiere
[root@centos7_3_1611 local]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6cf4370e5ea8 tomcat:7.0.94 "catalina.sh run" 14 minutes ago Exited (143) 9 minutes ago mytomcat cbb443467298 tomcat "catalina.sh run" 3 hours ago Created competent_lumiere 9668c3c6e5ec tomcat "catalina.sh run" 3 hours ago Created eager_ptolemy
3)、安装MySQL
安装mysql
docker pull mysql
正确的启动
-p 指定端口 (3307是虚拟机端口,3306是docker中的mysql默认端口,之所以用3307端口是我虚拟机中已经启动了非docker的mysql服务)
--e 环境变量参数
-d 后台daemon守护进程模式启动
docker run --name mysql02 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 ad10e4bc5c6a0f61cbad43898de71d366117d120e39db651844c0e73863b9434 docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ad10e4bc5c6a mysql "docker-entrypoint.sh" 4 seconds ago Up 2 seconds 0.0.0.0:3307->3306/tcp mysql02
复杂参数启动
docker run --name mysql03 --privileged=true -p 3307:3306 -v /conf/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.6 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci #把主机的/conf/mysql文件夹挂载到 mysqldocker容器的/etc/mysql/conf.d文件夹,这样修改改mysql的配置文件就只需要把mysql配置文件放在自定义的文件夹下(/conf/mysql) #指定mysql的一些配置参数,比如utf8编码
# --privileged=true 防止-v挂载的目录权限拒绝(permision denied)问题
docker挂载本地配置文件的话, 那么本地配置文件内容的路径其实应该写成docker容器里的路径,比如在虚拟机的/conf/mysql/my.cnf配置文件中应该把日志配置成如下:
[mysqld] #以下为docker容器中的默认路径 log-error=/var/log/mysql/error.log #以下为虚拟机中的路径 #log=/var/log/mysql/mysql.log #表名不区别大小写 lower_case_table_names=1
4)、docker安装redis
拉取
docker pull redis:5.0.6-alpine
创建redis和docker容器中的redis关联目录
mkdir -p /data/programs/docker/redis
在redis目录新建目录conf6379 , 并在下载redis配置文件(用于外部关联)
mkdir conf6379
cd conf6379
wget http://download.redis.io/redis-stable/redis.conf
在redis目录新建data目录用于关联docker容器中的redis数据
mkdir data6379
在redis目录把其下的所有文件权限赋给redis用户和redis组
chown -R redis:redis .
在redis目录 , 用redis身份启用docker容器中的redis , 因为用到了$PWD当前目录变量
cd /data/programs/docker/redis
docker run -p 6379:6379 --name myredis -v $PWD/conf6379/redis6379.conf:/etc/redis/redis.conf -v $PWD/data6379:/data -d redis:5.0.6-alpine redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
启动成功后, 再次启动命令
docker start myredis
本小节参考自: docker 安装redis 并配置外网可以访问==>https://www.cnblogs.com/sandea/p/11769518.html
更复杂的启动$$$
目前自己虚拟机中docker正是以该命令使用中
docker run --name mysql08 \
--privileged=true \ -p 3307:3306 \ -e MYSQL_ROOT_PASSWORD=abcde \ -v /data/mysql_docker/conf/my.cnf:/etc/mysql/my.cnf \ -v /data/mysql_docker/db:/var/lib/mysql \ -v /data/mysql_docker/log:/var/log/mysql \ -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
目前关于mysql的日志位置问题, 到现在也未找到, 以上命令挂载log文件夹确实是成功了的, 但是只有启动失败日志能打印出来
# 以交互模式访问docker容器中的mysql docker exec -it mysql03 bash root@7c289aa0ca95:/# mysql -uroot -p -h localhost Enter password:123456
# 查看实时日志 $ docker logs -f mysql03 # 查看最后1000行日志 $ docker logs --tail=1000 mysql03
docker导出和导入
本小节参考自: Docker导入、导出、删除容器==>http://www.cnblogs.com/linjiqin/p/8618635.html
1、export导出某个容器
docker export $container_id > mysql03.tar
2、import导入某个容器
cat mysql03.tar | docker import - mylocal/mysql03:v3
处理本地的容器快照导入为镜像,我们还可以通过指定一个URL或者目录来导入。
例如在某个网络上有个快照image_test.tgz:docker import http://xxxx.com/image_test.tgz test/image_test
镜像保存/载入:docker load/docker save;将一个镜像导出为文件,再使用docker load命令将文件导入为一个镜像,会保存该镜像的的所有历史记录。比docker export命令导出的文件大,很好理解,因为会保存镜像的所有历史记录。
容器导入/导出:docker import/docker export;将一个容器导出为文件,再使用docker import命令将容器导入成为一个新的镜像,但是相比docker save命令,容器文件会丢失所有元数据和历史记录,仅保存容器当时的状态,相当于虚拟机快照。
让非docker用户可以使用docker命令
可以先通过指令查看是否有用户组:
cat /etc/group | grep docker
如果有就跳过第一步!
第一步:创建docker用户组
groupadd docker
第二步:用户加入到用户组
usermod -aG docker 需要加入的用户名
第三步:检查是否有效
cat /etc/group
第四步:重启docker-daemon
systemctl restart docker
第五步:给docker.sock添加权限
chmod a+rw /var/run/docker.sock
如何修改docker容器中的配置文件
一、进入容器
docker run [option] 镜像名 [向启动容器中传入的命令]
常用可选[option]参数说明:
-i 表示以“交互模式”运行容器
-t 表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即 分配一个伪终端。
--name 为创建的容器命名
-v 表示目录映射关系(宿主机目录:容器中目录),可以使 用多个-v 做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后 共享到容器上, 此时两边增删文件都将同步。
-d 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不 会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
-p 表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p 做多个端口映射
-e 为容器设置环境变量
--network=host 表示将主机的网络环境映射到容器中,容器的网络与主机相同
# 修改配置文件
vi elasticsearch.yml
在使用docker容器时,有可能没有安装Vi, 安装Vi:apt-get install vim,如果提示:Unable to locate package vim,则需要敲:apt-get update, 等更新完毕以后再敲命令: apt-get install vim
原文:Docker容器修改配置文件==>https://blog.csdn.net/qq_41218849/article/details/82821459
在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。
但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置--rm选项,这样在容器退出时就能够自动清理容器内部的文件系统
docker run --rm mysql2
rm和rmi区别 及删除所有镜像或容器
# 删除所有容器 docker rm `docker ps -a -q` # 删除所有镜像 docker rmi `docker images -q`
https://www.cnblogs.com/yanyouqiang/p/8301856.html
docker外网无法访问(禁止docker容器访问外网)
在使用docker的过程中,有时候会遇到外网无法访问的问题,这可能是由于docker的网络配置问题导致的。
首先,我们需要检查docker的网络设置,可以使用以下命令:
docker network ls
这会列出所有的docker网络,我们需要确定当前使用的网络。然后使用以下命令查看网络的详细信息:
docker network inspect [network name]
在查看详细信息时,请注意检查“Options”部分。如果网络有自定义的DNS服务器,需要确保这些服务器是可访问的。
另外,还需要检查docker容器的端口映射设置是否正确。可以使用以下命令查看容器的详细信息:
docker container inspect [container name or id]
在查看详细信息时,请注意检查“HostConfig”部分。确保容器的端口映射设置正确,包括端口号和协议(TCP或UDP)。
除了检查网络和端口映射设置,还可以考虑使用docker本身的网络代理。可以使用以下命令启动一个代理容器:
docker run -d --restart=always -p 3128:3128 -e HTTP_PROXY=http://[proxy server]:[proxy port] -e HTTPS_PROXY=http://[proxy server]:[proxy port] --name proxy nginx
请注意将“[proxy server]”和“[proxy port]”替换为实际的代理服务器和端口号。然后在需要访问外网的容器中设置代理,例如:
docker run -it --rm --net [network name] -e http_proxy=http://[proxy server]:[proxy port] -e https_proxy=http://[proxy server]:[proxy port] [image name] /bin/bash
请注意将“[network name]”、“[proxy server]”和“[proxy port]”替换为实际的网络名、代理服务器和端口号。
总之,外网无法访问可能是由于docker网络配置问题导致的。通过检查网络和端口映射设置、配置docker网络代理等方法,可以解决这个问题。
本小节主要参考
docker外网无法访问(禁止docker容器访问外网)==>https://www.yzktw.com.cn/post/1298419.html
其它重要好文(与我遇到现象一致)
docker内无法通过域名访问外网问题解决方案==>https://blog.csdn.net/hacker_Lees/article/details/131068176
docker web管理工具
当我们开始使用docker后,我们的机器上镜像和容器会越来越多,或者有时候我们有多台开发机的时候,单纯使用命令行去管理镜像和容器就变得麻烦了,这时,我们就可以选择一些可视化的容器管理工具来保护我们为数不多的头发了。portainer.io就是这方面的一个不错的选择,它有社区版和商业版,质量相对有保证,对于我们个人,使用社区版足矣。
portainer.io安装很容易,可以直接用docker启动:
docker run -d --name portainer -p 8000:8000 -p 9443:9443 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --restart always portainer/portainer-ce:latest
docker从零启动各应用命令行
docker启动mysql
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql:latest
docker启动tomcat
docker启动redis
前提: $PWD/conf6379/redis6379.conf 文件改配置
# 注释之后即为绑定所有网卡 # bind 127.0.0.1 ::1 设置连接密码 requirepass ilovecnblogs
docker pull redis:5.0.6-alpine
cd /data/programs/docker/redis
docker run -p 6379:6379 --name myredis -v $PWD/conf6379/redis6379.conf:/etc/redis/redis.conf -v $PWD/data6379:/data -d redis:5.0.6-alpine redis-server /etc/redis/redis.conf --appendonly yes --requirepass "123456"
目前ecs主机上使用 docker start redis6379
docker启动rabbitmq
5672是rabbitmq服务端口, 15672是rabbitmq 网页管理端口, 使用默认帐号/密码 guest/guest 访问 http://IP:15672/ 即可.
docker pull rabbitmq:3.7-management-alpine
docker run --name=myrabbitmq -p 5672:5672 -p 15672:15672 -d imageId
注意rabbitmq的标签3.7-management-alpine ,一定要安装带management的, 这种才有网页管理界面
docker启动ElasticSearch
docker pull docker.io/elasticsearch:6.5.1 docker run -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -d -p 9200:9200 -p 9300:9300 --name myELK elkImageId
遇见异常
Error response from daemon: Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password
修改镜像地址 vi /etc/docker/daemon.json
{
"registry-mirrors" : [
"https://6kx4zyno.mirror.aliyuncs.com"
"https://registry.docker-cn.com",
"https://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com",
"https://mirror.ccs.tencentyun.com"
]
}
更新配置,重启docker
systemctl daemon-reload systemctl restart docker
另外的说法 docker拉取镜像错误 missing signature key==>https://blog.csdn.net/qq_39825717/article/details/132605314