Docker 入门
in with 0 comment

Docker 入门

in with 0 comment

一、Docker

简介

官网:https://www.docker.com/

官方文档:https://docs.docker.com/get-started/

Docker是一个开源的应用容器引擎;是一个轻量级容器技术;

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

在Linux虚拟机上安装Docker

1、检查内核版本,必须是3.10及以上

uname -r

2、安装docker

yum install docker

3、输入y确认安装

4、启动 docker

systemctl start docker

5、查看 docket 版本

docker -v

6、开机启动 docker

systemctl enable docker

7、停止docker

systemctl stop docker

附:centos7 docker升级到最新稳定版本

最新版本

测试 Docker 运行

1、通过运行简单的Docker映像测试安装是否工作, hello-world:

# docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

2、列出下载到您的机器上的hello-world镜像:

# docker image ls

REPOSITORY      TAG      IMAGE ID       CREATED       SIZE
hello-world     latest    fce289e99eb9  6 months ago  1.84kB

3、列出hello-world容器(由镜像生成),该容器在显示其消息后退出。如果它还在运行,您就不需要—all选项:

# docker container ls --all
CONTAINER ID     IMAGE           COMMAND      CREATED            STATUS
54f4984ed6a8     hello-world     "/hello"     20 seconds ago     Exited (0) 19 seconds ago

配置阿里云镜像加速器

登录阿里云开发者平台

https://cr.console.aliyun.com

获取加速器地址,并配置

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xx-your-xx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

# 检查docker镜像是否配置成功
docker info
#倒数三四行
Registry Mirrors:
  https://l3onhrwo.mirror.aliyuncs.com/    ---阿里云镜像
  https://docker.mirrors.ustc.edu.cn/      ---中国科学技术大学镜像

#或者可以查看 /etc/docker 下的daemon.json文件
[root@localhost ~]# cat /etc/docker/daemon.json 
{
  "registry-mirrors": ["https://l3onhrwo.mirror.aliyuncs.com","https://docker.mirrors.ustc.edu.cn"]
}
[root@localhost ~]# 

Docker常用命令&操作

镜像操作

操作命令说明
检索docker search 关键字 eg:docker search redis我们经常去docker hub上检索镜像的详细信息,如镜像的TAG。
拉取docker pull 镜像名:tag:tag是可选的,tag表示标签,多为软件的版本,默认是latest
列表docker images查看所有本地镜像
删除docker rmi image-id删除指定的本地镜像

https://hub.docker.com/

docker无法删除掉镜像的解决方法

删除某镜像时提示:

Error: No such image: fce289e99eb9

进入/var/lib/docker/images/的相关目录,删除残留文件:

# cd `find /var/lib/docker -path '*/imagedb/*tent/sha256'`
# ll
总用量 20
-rw------- 1 root root 6668 8月  24 10:31 5a3221f0137beb960c34b9cf4455424b6210160fd618c5e79401a07d6e5a2ced
-rw------- 1 root root 6648 8月  24 10:51 f7302e4ab3a81ad2d8033bc0088e5c335e7f046870f76728286bfb3fb17b3221
-rw------- 1 root root 1510 8月  23 08:08 fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
[root@iZbp1fld0iwc92hyabexg7Z sha256]# rm -f fce2*

参考:https://zhangguanzhang.github.io/2018/02/05/docker-image-can-t-rm/

容器操作

软件镜像(QQ安装程序)----运行镜像----产生一个容器(正在运行的软件,运行的QQ);

【此处以安装 rabbitmq 为例】步骤:

注:获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面。

1、搜索镜像
# docker search rabbitmq:management

NAME     DESCRIPTION              STARS               OFFICIAL            AUTOMATED
macintoshplus/rabbitmq-management   Based on rabbitmq:management    5           [OK]
transmitsms/rabbitmq-sharded        Fork of rabbitmq:management with sharded_exc…   0   
xiaochunping/rabbitmq               xiaochunping/rabbitmq:management   2018-06-30   0   

2、拉取镜像
# docker pull rabbitmq:management

management: Pulling from library/rabbitmq
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
eef17c6cb6cf: Pull complete 
1b1c29c0085b: Pull complete 
f8dfa8d24f5a: Pull complete 
eb8ab9a01cdc: Pull complete 
ab779a040984: Pull complete 
5662cbdafc1c: Pull complete 
7f07e4815b29: Pull complete 
b056c3deadc8: Pull complete 
Digest: sha256:5d61d789788cc4ee4396b693f99b1763086d43fd2ee215ca6f2725784131d0f7
Status: Downloaded newer image for rabbitmq:management

3、运行镜像
# docker run -d --hostname my-rabbit --name rabbit -p 5672:5672 -p 15672:15672 rabbitmq:management

1aeb5bd4bb70a8cda409ef8ff911980705319c31407943eccd4e917687e4ba25

--d: 后台进程运行
--hostname:指定容器主机名称
--name:指定容器名称
--p:将mq端口号映射到本地
--p:15672:15672 http访问端口
--p:5672:5672 amqp访问端口
--i: 以交互模式运行容器,通常与 -t 同时使用
--t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用

4、查看运行中的容器
# docker ps

CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                 NAMES
9820f1cd68d4        rabbitmq:management   "docker-entrypoint.s…"   12 minutes ago      Up 12 minutes       4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbit

5、 停止运行中的容器
# docker stop  容器的id

6、查看所有的容器
# docker ps -a

7、启动容器
# docker start 容器id

8、删除一个容器
# docker rm 容器id

更多命令参看
https://docs.docker.com/engine/reference/commandline/docker/

此时就可以登录RabbitMQ 的 WEB界面了,访问地址是[ip:15672]默认用户名和密码都是guest

rabbitmq

注:此处是部署在阿里云上的,如果要访问15672端口,需要设置安全组,详情查看:添加安全组规则

如果是本地虚拟机运行的话,关闭防火墙:

#关闭防火墙设置开机不启动
[root@docker ~]# systemctl stop firewalld
[root@docker ~]# systemctl disable firewalld

参考文章:[RabbitMQ系列(五)使用Docker部署RabbitMQ集群]

Docker 实例

Docker 安装 Nginx

1、搜索镜像
# docker search nginx
NAME    		DESCRIPTION               	 STARS     OFFICIAL            AUTOMATED
nginx    		Official build of Nginx.  	 11864     [OK]                
jwilder/nginx-proxy    Automated Nginx        1641                            [OK]
richarvey/nginx-php-fpm   Container running Nginx +   736               	  [OK]

2、拉取镜像
#docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
1ab2bdfe9778: Pull complete 
a17e64cfe253: Pull complete 
e1288088c7a8: Pull complete 
Digest: sha256:53ddb41e46de3d63376579acf46f9a41a8d7de33645db47a486de9769201fec9
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

3、查看镜像
#docker images nginx
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              5a3221f0137b        8 days ago          126MB

4、启动 Nginx 容器实例
#docker run --name tyron-nginx -p 8888:80 -d nginx
tyron-nginx 容器名称。
-d 设置容器在在后台一直运行。
-p 端口进行映射,将本地 8888 端口映射到容器内部的 80 端口。

4.1、配置代理启动
#docker run -d --name nginx -p 80:80 --net host 
-v /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf 
-v /docker/nginx/log:/var/log/nginx 
-v /docker/nginx/html:/usr/share/nginx/html 
-v /docker/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf 
nginx

--net host 告诉 Docker 不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络 
参考:https://blog.51cto.com/13362895/2130375(docker之网络配置)
(1)第一个“-v”,是项目位置,把项目放到挂载到的目录下即可;
(2)第二个“-v”,是挂载的主配置文件"nginx.conf",注意"nginx.conf"文件内有一行"include /etc/nginx/conf.d/*.conf;",这个include指向了子配置文件的路径,此处注意include后所跟的路径一定不要出错。
(3)第三个“-v”,把docker内子配置文件的路径也挂载了出来,注意要与(2)中include指向路径一致
(4)重点强调一下,nginx.conf是挂载了一个文件(docker是不推荐这样用的),conf.d挂载的是一个目录

Docker 安装 Redis 5.0.5

1、搜索镜像
# docker search redis
NAME           DESCRIPTION               STARS         OFFICIAL        AUTOMATED
redis     	  Redis is an open source 	  7247          [OK]                
bitnami/redis Bitnami Redis Docker Image  125                            [OK]
sameersbn/redis                            77                            [OK]
grokzen/redis-cluster Redis cluster 3.0, 3.2, 4.0 & 5.0              54                 
rediscommander/redis-commander   Alpine image for redis-commander    30  [OK]

2、拉取镜像
# docker pull redis:5.0.5
5.0.5: Pulling from library/redis
1ab2bdfe9778: Already exists 
966bc436cc8b: Pull complete 
c1b01f4f76d9: Pull complete 
8a9a85c968a2: Pull complete 
8e4f9890211f: Pull complete 
93e8c2071125: Pull complete 
Digest: sha256:9755880356c4ced4ff7745bafe620f0b63dd17747caedba72504ef7bac882089
Status: Downloaded newer image for redis:5.0.5
docker.io/library/redis:5.0.5

3、查看镜像
# docker images redis
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               5.0.5               f7302e4ab3a8        9 days ago          98.2MB

Docker 安装 halo

#docker run  --name mynginx -d -p 80:80 --net host  -v /etc/nginx/html:/usr/share/nginx/html -v /etc/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /etc/nginx/conf.d:/etc/nginx/conf.d  -v /etc/nginx/logs:/var/log/nginx nginx

参考:

Docker 教程

用 Docker 运行 Nginx 容器做域名反向代理

docker nginx 部署多个项目