docker book

主页

docker是一个开源的应用容器引擎, 它的性能要高于虚拟机. 

docker官方查找应用:  https://hub.docker.com/

 

 

web管理界面: Docker的web端管理平台对比(DockerUI 、Shipyard、Portainer、Daocloud)==>https://blog.csdn.net/qq273681448/article/details/75007828/

docker的各元素概念

docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上);

docker客户端(Client):连接docker主机进行操作;

docker仓库(Registry):用来保存各种打包好的软件镜像;

docker镜像(Images):软件打包好的镜像;放在docker仓库中;

docker容器(Container):镜像启动后的实例称为一个容器;容器是独立运行的一个或一组应用

 

 

Docker使用步骤

1)、安装Docker

2)、去Docker仓库找到这个软件对应的镜像;

3)、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器;

4)、对容器的启动停止就是对软件的启动停止;

 

安装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:后台运行
#-p: 将主机的端口8888映射到容器的一个端口8080 主机端口:容器内部的端口

关于端口映射问题 ,
有的 docker run -p 30000:80 nginx 会把主机端口一并打开 (比如 nginx ,tomcat),
有的 docker run -p 40000:80 b3log/siyuan:v1.5.6 (旧版本)
不会把主机端口一并打开(比如 siyuan , 当初在这个上面坑了好久) 用 docker run -p 40000:80 b3log/siyuan:v2.10.6 是正常的
重点就在于不同的容器各有各的配置和限制

查看运行中的容器 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 那样指定写一堆参数

docker 和 docker-compose 安装、配置(windows+linux)==>https://blog.csdn.net/ziqibit/article/details/129698618

 

 

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

 

 

【Docker】Docker network之bridge、host、none、container以及自定义网络的详细讲解==>https://blog.csdn.net/H1727548/article/details/132317212

指定 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文件夹确实是成功了的, 但是只有启动失败日志能打印出来

 

 

4. 在shell中访问docker容器中的mysql
docker exec -it  container_id  bash 进入容器终端并且的保留为容器终端的输入形式 , -i 为 interactive(交互)的缩写 , -t为 teletype (电传打字机) 的缩写
# 以交互模式访问docker容器中的mysql
docker exec -it mysql03 bash
root@7c289aa0ca95:/#
mysql -uroot -p -h localhost
Enter password:123456

 

输入密码即可,正常的话就可以用客户端连接root/123456 以3307端口 登录了

 

5. 在shell中访问mysql日志
# 查看实时日志
$ 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命令要用sudo的问题==>https://www.jianshu.com/p/1354e0506753

 

 如何修改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

--rm参数

在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管理工具

portainer

当我们开始使用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

posted @ 2019-05-05 09:50  苦涩泪滴  阅读(179)  评论(0编辑  收藏  举报