Docker简介

Docker的英文意思是 码头工人,一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发+运维之间的协作我们需要关心很多东西,这也是很多互联网公司都不得不面对的问题,特别是各种版本的迭代之后,不同版本环境的兼容,对运维人员都是考验
Docker之所以发展如此迅速,也是因为它对此给出了一个标准化的解决方案。
环境配置如此麻烦,换一台机器,就要重来一次,费力费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。简言之,就是可以在Linux上镜像使用的这么一个容器。

Docker理念

一次封装,到处运行

解决了运行环境和配置问题软件容器,方便做持续集成并有助于整体发布的容器虚拟化技术。

Docker的基本组成

1、镜像

Docker 镜像(Image) 就是一个只读的模板。镜像可以用来创建 Docker容器,一个镜像可以创建很多容器。

2、容器

Docker 利用容器(Container) 独立运行的一个或一组应用。容器是用来创建运行实例,可以把容器看做是一个简易般的 Linux 环境。

3、仓库
仓库(Repository) 是集中存放镜像文件的场所,最大的公开仓库是Docker Hub。

Docker和VM对比

Docker利用的是宿主机的内核,而不需要CentOS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引寻、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载CentosOS,返个新建过程是分钟级别的。而Docker由于直接利用宿主机的操作系统,则省略了返个过程,因此新建一个Docker容器只需要几秒钟。

Docker相关地址

1、Docker官网:传送

2、Docker仓库:传送

3、阿里云容器镜像服务:传送

Docker安装

查看自己系统相关信息

# 查看系统的内核
[root@iZ2zej1alu07023nc5lzsoZ ~]# uname -r
3.10.0-1062.1.2.el7.x86_64

# 查看系统版本
[root@iZ2zej1alu07023nc5lzsoZ ~]# uname -r
3.10.0-1062.1.2.el7.x86_64

安装

帮助文档:传送

开始安装Docker

# 1、卸载Docker
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 2、安装所需要的包

yum install -y yum-utils

# 3、设置镜像仓库
yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的

# 阿里云镜像(这里使用阿里云的)
yum-config-manager \
    --add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
yum makecache fast
# 4、安装docker  docker-ce(社区版) ee(企业版)
yum install docker-ce docker-ce-cli containerd.io
# 5、启动docker
systemctl start docker
# 6、查看是否启动成功
systemctl status docker
# 7、验证Docker是否正确被安装
docker run hello-world
# 8、查看镜像
docker images

配置镜像加速

cd /etc/docker
vi  /etc/docker/daemon.json

打开阿里云镜像服务,复制下面红色标注的地
方。

配置并使用

# 第一步
sudo mkdir -p /etc/docker
# 第二步
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["自己的镜像地址"]
}
EOF
# 第三步
sudo systemctl daemon-reload
# 第四步
sudo systemctl restart docker

Docker常用命令

Docker命令文档地址:传送

帮助命令

docker version # 显示docker的版本信息
docker info # 显示docker系统信息包含镜像和容器
docker 命令 --help # 帮助信息

镜像命令

docker images # 查看所有本地主机的镜像
[root@iZ2zej1alu07023nc5lzsoZ docker]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB
# 解释
REPOSITORY:仓库源
TAG:镜像的标签
IMAGE ID:镜像的ID
CREATED:镜像的创建时间
SIZE:镜像的大小
# 可选项
-a, --all             列出所有镜像
-q, --quiet           只显示镜像的id

1、搜索镜像

[root@iZ2zej1alu07023nc5lzsoZ docker]# docker search mysql
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9535                [OK]
# 可选项
 -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
--filter=STARS=3000 #搜索镜像下载量大于3000的

2、下载镜像

docker pull 镜像名[:tag]
如:docker pull mysql:5.7

3、删除镜像

docker rmi -f # 删除所有
docker rmi -f 镜像id 镜像id 镜像id # 删除指定镜像
docker rmi -f $(docker images -aq) # 删除全部容器

容器命令

1、运行容器

docker run [可选参数] image
# 参数
-name="名字"  容器名字
-d             以后台方式运行
-it           使用交互方式进入容器
-p            指定容器的端口
  -p ip:主机端口:容器端口
  -p 主机端口:容器端口 (常用的)
  -p 容器端口
-P             随机指定端口
# 启动并进入容器
[root@iZ2zej1alu07023nc5lzsoZ docker]# docker run -it centos /bin/bash
[root@b6b951d37c1d /]#
# 从容器退回主机
[root@b6b951d37c1d /]# exit

2、列出所有运行中的容器

docker ps # 列出当前正在运行的容器
-a    # 列出当前正在运行的容器 + 历史运行过的容器
-n=?  # 显示最近创建的容器
-q    # 只显示容器的id

3、删除容器

exit # 直接停止并退出
Ctrl+P+Q # 容器不停止退出
docker attach 容器id             # 进入运行中的容器
docker exec -it 容器id /bin/bash # 进入运行中的容器
attach和exec有什么区别:
使用exec进入容器,退出使用exit不会把容器给停止掉,而attach则需要使用快捷键进行退出。

4、启动和停止容器

docker start 容器id    # 启动容器
docker restart 容器id  # 重启容器
docker stop 容器id     # 停止容器
docker kill 容器id     # 强制停止容器

5、以后台的方式启动容器

docker run -d 镜像名
# 使用以上命令启动centos,发现centos停止了,因为容器启动必须有一个前台进程。

6、查看容器日志

docker logs -tf # 实时日志查看
docker logs -tf --tail number # 显示日志条数

7、查看容器中的进程

docker  top  容器id

8、查看容器的元数据

docker inspect 容器id

9、将容器内文件拷贝到主机上面

docker cp 容器id:容器路径 主机路径

命令整理

attach        # 当前 shell下 attach 连接指定运行镜像
build         # 通过 Dockerfile 定制镜像
commit        # 提交当前容器为新的镜像
cp            # 从容器中拷贝指定文件或目录到宿主机中
create        # 创建一个新的容器,同 run 但不启动容器
diff          # 查看 docker 容器变化
events        # 从 docker 服务获取容器实时事件
exec          # 在已存在的容器上运行命令
export        # 导出容器的内容流作为一个 tar 归档文件 对于 【import】
history       # 展示一个镜像形成历史
images        # 列出 docker 里面的镜像
info          # 显示系统相关信息
inspect       # 查看容器详细信息
kill          # kill 指定 docker 容器
load          # 从一个 tar 包中加载一个镜像 【对应 save】
login         # 注册或登录一个 docker 源服务器
logout        # 从当前 docker registry 退出
logs          # 输出当前容器日志信息
port          # 查看你映射端口对应的容器内部源端口
pause         # 暂停容器
ps            # 列出容器列表
pull          # 从 docker 镜像源服务器拉取指定镜像
push          # 推送指定镜像到 docker 源服务器
restart       # 重启运行的容器
rm            # 移除一个或者多个容器
rmi           # 移除一个或者多个镜像 【移除运行中的镜像则需要加 -f】
run           # 创建一个新的容器并运行
save          # 保存一个镜像为一个 tar 包 【对应load】
search        # 在 docker hub 中搜索镜像
start         # 启动容器
stop          # 停止容器
stats         # 监控容器资源消耗
tag           # 给源中镜像添加标签
top           # 查看容器中运行的进程信息
unpause       # 取消暂停容器
version       # 查看 docker 版本号
wait          # 截取容器停止时的退出状态值

Docker容器状态

# 停止docker
systemctl stop docker
# 启动
systemctl start docker
# 查看docker状态
systemctl status docker

Docker之run命令的一些参数

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的高端口

-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

--name="nginx-lb": 为容器指定一个名称;

--dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

--dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

-h "mars": 指定容器的hostname;

-e username="ritchie": 设置环境变量;

--env-file=[]: 从指定文件读入环境变量;

--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

-m :设置容器使用内存最大值;

--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

--link=[]: 添加链接到另一个容器;

--expose=[]: 开放一个端口或一组端口;

--volume , -v:    绑定一个卷

Other

# 1、列出无用的卷
docker volume ls -qf dangling=true

# 2、清理无用的卷
docker volume rm $(docker volume ls -qf dangling=true)

# 3、Docker磁盘占用与清理
docker system prune

https://www.jianshu.com/p/470e29801be2

Docker可视化-portainer

Docker图形化界面管理工具,提供一个后台面板供我们操作!

# 1、下载
docker pull docker.io/portainer/portainer


# 2、这里是把portainer端口映射外网的3344
docker run -d -p 3344:9000 \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
--name prtainer01 \
--privileged=true \
docker.io/portainer/portainer

第一次加载可能会比较慢一些。

3、设置密码

4、选择本地即可

Docker数据挂载

有很多时候我们都需要把容器里面的目录和宿主机目录保持同步,比如mysql的data目录conf目录等。

首先先下载两个镜像,一个是centos另一个nginx。

1、通过命令进行挂载

# -v 就是目录挂载
docker run -it -v 宿主机目录:容器目录 centos /bin/bash
宿主机目录如果不存在,则会自动生成

# 查看挂载详情
docker inspect 容器id

2、匿名挂载

docker run -d -p --name nginx01 -v /etc/nginx nginx
# 查看所有卷的信息
docker volume ls
local               44f1b7b73db6a018e50d5ce67615187ecd1e72e5bebd2e7a48fadd550b5b55ac
# 所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data

扩展:

docker run -d -p --name nginx01 -v /home/nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx01 -v /home/nginx:/etc/nginx:rw nginx
通过 -v 容器内路径:ro rw 改变读写权限
ro realonly  # 只读
rw readwrite # 可读可写 (默认)

安装Mysql并挂载

# 获取镜像
docker pull mysql5.7
docker run -d -p 3344:3306 -v (挂载mysql配置文件地址):/etc/mysql/conf.d -v (挂载mysql数据文件地址):/var/lib/mysql -e MYSQL_ROOT_PASSWORD=(mysql密码)--name mysql01 容器id或者容器名称
# 示例:
docker run -d -p 3344:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# 使用mysql连接工具进行测试

镜像发布到阿里云

# 第一步打包修改之后的镜像--图1
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:版本号
# 第二步 打开阿里云镜像管理中心 https://cr.console.aliyun.com,创建一个 命名空间
# 第三步 创建 镜像仓库 --图2
填写仓库名称,摘要,设置代码源为本地仓库。最后点击创建镜像仓库即可。
# 第四步 点击管理
按照提示即可把自己的镜像源推送到阿里云镜像仓库。
如果不知道或者忘记自己登陆docker的密码,可以点击下面的按钮镜像更改。
# 退出阿里云
docker logout

图1:

图2: