一文带你入门Docker容器服务 #yyds干货盘点#

Posted 江晓龙的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文带你入门Docker容器服务 #yyds干货盘点#相关的知识,希望对你有一定的参考价值。

@TOC

1.Docker的安装及使用

Docker是通过内核虚拟化技术来提供容器的资源隔离与安全保障。由于docker通过操作系统层的虚拟化实现隔离,所以docker容器在运行时,不需要类似虚拟机额外的操作系统开销,提高资源利用率

Docker初期把lxc二次开发,后来觉得lxc是在不能满足需求,再次开发了libcontainer

Docker的主要目标是“Build,ship,and run any app,angwhere” 构建,传输,处处运行,也就是以此构建,处处运行

docker容器也是一种软件的打包技术,只要是找到进行的地址,下载镜像即可运行

构建:做一个docker镜像

运输:docker pull

运行:启动一个容器

每一个容器,都有自己的文件系统rootfs

docker的主要组成部分是cs架构

docker镜像下载网站

1.1.docker的安装

可以使用清华开源镜像网站的软件包进行安装

网址:https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/

1.下载镜像
[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

2.修改镜像地址
[root@docker01 ~]# sed -i s#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce# /etc/yum.repos.d/docker-ce.repo 

3.清除yum缓存
[root@docker01 ~]# yum makecache fast

4.安装docker,并将docker软件缓存到本地
[root@docker01 ~]# yum -y install docker-ce 

5.启动docker
[root@docker01 ~]# systemctl start docker

6.查看docker进程和版本
[root@docker01 ~]# ps aux | grep docker
root      72846  0.2  3.4 569132 64068 ?        Ssl  16:16   0:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

[root@docker01 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.11
 API version:       1.40
 Go version:        go1.13.10
 Git commit:        42e35e61f3
 Built:             Mon Jun  1 09:13:48 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.11
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.10
  Git commit:       42e35e61f3
  Built:            Mon Jun  1 09:12:26 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

1.2.运行第一个容器

默认从国外的网站进行获取

安装好之后直接访问即可,他们在制作镜像的时候已经全部配置好了

语法格式:

​ docker run 选项 物理机端口:虚拟机端口 容器名称

[root@docker01 ~]# docker run -d -p 80:80 nginx
Unable to find image nginx:latest locally         //本地没有这个镜像,可以用docker pull来下载
latest: Pulling from library/nginx                  //去库里面下载镜像
8559a31e96f4: Pull complete 
8d69e59170f7: Pull complete 
3f9f1ec1d262: Pull complete 
d1f5ff4f210d: Pull complete 
1e22bfa8652e: Pull complete 
Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Status: Downloaded newer image for nginx:latest
3f68380ac4a4f5329b6995fb1b3ee6b41df55716661c7bdd7a574e13abc8d5b1

-d:后台启动
-p:端口映射,服务器的80端口映射成容器的80端口

![26385414)(C:\\Users\\Administrator\\AppData\\Roaming\\Typora\\typora-user-images\\image-20200620163721567.png)]](https://s4.51cto.com/images/blog/202203/03090417_622014116f6161844.png?x-oss-process=image/watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

2.docker镜像管理

2.1.搜索镜像

语法格式
docker search 镜像名

选镜像的建议:
1.优先考虑官方
2.starts数量多

[root@docker01 ~]# docker search httpd
NAME                                    DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                                   The Apache HTTP Server Project                  3067                [OK]                
centos/httpd-24-centos7                 Platform for running Apache httpd 2.4 or bui…   33                                      

NAME:镜像名称,一般镜像名称前面没有/的表示官方
DESCRIPTION:镜像描述
STARS:点赞数量
OFFICIAL:是否是官方
AUTOMATED:是否自动化安装

2.2.获取镜像

docker pull 镜像名(push)

docker pull 第三方镜像连接

[root@docker01 ~]# docker pull httpd:2.2
2.2: Pulling from library/httpd
f49cf87b52c1: Pull complete 
24b1e09cbcb7: Pull complete 
8a4e0d64e915: Pull complete 
bcbe0eb4ca51: Pull complete 
16e370c15d38: Pull complete 
Digest: sha256:9784d70c8ea466fabd52b0bc8cde84980324f9612380d22fbad2151df9a430eb
Status: Downloaded newer image for httpd:2.2
docker.io/library/httpd:2.2

2.3.镜像加速

1.配置加速器地址
[root@docker01 ~]# vim /etc/docker/daemon.json 

        "registry-mirrors": ["https://registry.docker-cn.com"]


2.重载服务
[root@docker01 ~]# systemctl restart docker

3.下载一个镜像看看有没有加速
[root@docker01 ~]# time docker pull httpd:2.4
2.4: Pulling from library/httpd
8559a31e96f4: Already exists 
bd517d441028: Pull complete 
f67007e59c3c: Pull complete 
83c578481926: Pull complete 
f3cbcb88690d: Pull complete 
Digest: sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51
Status: Downloaded newer image for httpd:2.4
docker.io/library/httpd:2.4

real    0m46.383s
user    0m0.037s
sys 0m0.038s

2.4.查看所有镜像

两种方式

[root@docker01 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2622e6cca7eb        10 days ago         132MB
httpd               2.4                 ccbcea8a6757        11 days ago         166MB
httpd               2.2                 e06c3dbbfe23        2 years ago         171MB

[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2622e6cca7eb        10 days ago         132MB
httpd               2.4                 ccbcea8a6757        11 days ago         166MB
httpd               2.2                 e06c3dbbfe23        2 years ago         171MB

REPOSITORY:镜像名称
TAG:版本
IMAGE ID:镜像id
CREATED:创建时间
SIZE:大小

2.5.备份镜像

语法格式:

​ docker save 镜像名:版本 > xxx.tar.gz

[root@docker01 ~]# docker save nginx:latest > docker_nginx_latest.tar.gz

2.6.删除镜像

语法格式:

​ docker image rm 镜像名:版本

[root@docker01 ~]# docker image rm nginx:latest
Error response from daemon: conflict: unable to remove repository reference "nginx:latest" (must force) - container 3f68380ac4a4 is using its referenced image 2622e6cca7eb

删除报错表示docker中的nginx开启,需要强制删除
[root@docker01 ~]# docker image rm nginx:latest --force 
Untagged: nginx:latest
Untagged: nginx@sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133
Deleted: sha256:2622e6cca7ebbb6e310743abce3fc47335393e79171b9d76ba9d4f446ce7b163

2.7.恢复镜像

语法格式:

​ docker load -i xxx.tar.gz

[root@docker01 ~]# docker load -i nginx_docker_lastst.tar.gz 
Loaded image: nginx:latest
[root@docker01 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2622e6cca7eb        10 days ago         132MB
httpd               2.4                 ccbcea8a6757        11 days ago         166MB
httpd               2.2                 e06c3dbbfe23        2 years ago         171M

启动镜像
[root@docker01 ~]# docker run  -d -p 80:80 nginx:latest  

2.8.镜像硬链接

语法格式:

​ docker image tag 原镜像 新镜像

[root@docker01 ~]# docker image tag httpd:2.2 http_test
[root@docker01 ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2622e6cca7eb        10 days ago         132MB
httpd               2.4                 ccbcea8a6757        11 days ago         166MB
http_test           latest              e06c3dbbfe23        2 years ago         171MB
httpd               2.2                 e06c3dbbfe23        2 years ago         171MB

删除原后新的还在
[root@docker01 ~]# docker image rm httpd:2.2
Untagged: httpd:2.2
Untagged: httpd@sha256:9784d70c8ea466fabd52b0bc8cde84980324f9612380d22fbad2151df9a430eb
[root@docker01 ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              2622e6cca7eb        10 days ago         132MB
httpd               2.4                 ccbcea8a6757        11 days ago         166MB
http_test           latest              e06c3dbbfe23        2 years ago         171MB

3.Docker容器日常命令

3.1.查看命令帮助信息

语法格式:
    docker help
    docker 参数 --help
    docker help 参数

3.2.运行一个容器(run)

语法格式:

​ docker run 选项 容器名 CMD

docker run命令选项可以多次调用例如-p,-p 80:80 -p 22:22可以用多次

详细参数:https://www.cnblogs.com/xiaobaiskill/p/12203575.html

注意相同的镜像可以运行多次,并且每次的配置文件、容器地址、容器id都是不同的

每启动一个容器都会多一块veth的网卡

后台启动一个容器
[root@docker01 ~]# docker run -d -p 92:80 httpd:2.4

-d表示后台启动
-p表示端口映射

进入容器里面
[root@docker01 ~]# docker run -it  centos:latest 
[root@f6ffc8f8bc12 /]#
默认以容器的id作为主机名
指定容器的名称
[root@docker01 ~]# docker run -it  --name centos8.2 centos:latest 

不进入容器内部运行命令
直接在最后跟上命令即可
[root@docker01 ~]# docker run -it centos:latest ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 03:40 pts/0    00:00:00 ps -ef

-it分配交互式的终端
--name指定容器的名字
ps -ef会覆盖容器的初始命令
docker run===docker create + docker start

如果不指定容器的名称则随机生成一个

3.3.查看容器列表(ps)

只有对镜像进行操作时才会产生容器,默认导入一个镜像是不会产生容器的,所谓的操作比如启动镜像,对镜像进行命令输入等等

语法格式:

docker ps

参数:

​ -a:显示所有容器

​ -l:显示最近启动的一个容器

​ -q:只打印容器id

两种方式
第一种
只查看运行中的容器
[root@docker01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
302487e46eda        httpd:2.4           "httpd-foreground"       14 minutes ago      Up 14 minutes       0.0.0.0:92->80/tcp   loving_burnell
8049b1310b2a        httpd:2.4           "httpd-foreground"       54 minutes ago      Up 54 minutes       0.0.0.0:90->80/tcp   elastic_williamson
7ac3d66b2bc2        nginx:latest        "/docker-entrypoint.…"   57 minutes ago      Up 57 minutes       0.0.0.0:80->80/tcp   laughing_gangul

查看所有容器
[root@docker01 ~]# docker ps -a

CONTAINER ID            //容器ID
IMAGE                   //镜像名称
OMMAND                  //运行的命令
CREATED                 //何时开启的容器
STATUS                  //多长时间将容器打开
PORTS                   //端口
NAMES                   //容器名称

第二种
只查看运行中的容器
[root@docker01 ~]# docker container ls

查看所有容器
[root@docker01 ~]# docker container ls -a

3.4.删除一个或多个容器(rm)

语法格式:**

​ docker container rm 容器名

​ -f:强制删除

删除容器操作慎用,当容器删除里面的数据也会随着删除

[root@docker01 ~]# docker container rm inspiring_goodall sad_haibt intelligent_pasteur condescending_lewin
inspiring_goodall
sad_haibt
intelligent_pasteur
condescending_lewin

删除容器时不光可以对根据容器名删除也可以根据容器id进行删除
[root@docker01 ~]# docker container rm 31809b0b3a41
31809b0b3a41

批量删除所有容器
先停止所有容器
[root@docker01 ~]# docker ps -q |xargs docker stop
72b4e5321fa3
302487e46eda
8049b1310b2a
删除所有容器
[root@docker01 ~]# docker ps -a -q |xargs docker rm
72b4e5321fa3
302487e46eda
8049b1310b2a

3.5.关闭、杀死、启动、重启容器(start...)

语法格式:

​ docker [start|kill|stop|restart] 容器名称

or

​ docker container [start|kill|stop|restart] 容器名称

关闭
[root@docker01 ~]# docker stop nginx
nginx

杀死
[root@docker01 ~]# docker kill 72b4e5321fa3
72b4e5321fa3
[root@docker01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS                NAMES
72b4e5321fa3        nginx:latest        "/docker-entrypoint.…"   3 hours ago         Exited (137) 15 seconds ago                        nginx
杀死的进程在exited()中的值都是非0的值

启动
[root@docker01 ~]# docker start nginx
nginx

重启容器
[root@docker01 ~]# docker restart nginx
nginx

如果想进入交互式就用-i参数
[root@docker01 ~]# docker start -i 72b4e5321fa3

3.6.容器改名(rename)

语法格式:

docker container rename oldname newname

[root@docker01 ~]# docker container rename loving_burnell httpd92
[root@docker01 ~]# docker container rename elastic_williamson httpd90
[root@docker01 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                NAMES
72b4e5321fa3        nginx:latest        "/docker-entrypoint.…"   18 minutes ago      Up 39 seconds              0.0.0.0:80->80/tcp   nginx
89abef11a967        centos:latest       "/bin/bash"              41 minutes ago      Exited (0) 7 minutes ago                        centos8.2
302487e46eda        httpd:2.4           "httpd-foreground"       44 minutes ago      Up 3 minutes               0.0.0.0:92->80/tcp   httpd92
8049b1310b2a        httpd:2.4           "httpd-foreground"       About an hour ago   Up About an hour           0.0.0.0:90->80/tcp   httpd90

3.7.容器与宿主机之间文件互传(cp)

由于容器中很多命令没有安装,因此需要传到宿主机上修改后再传至容器中

语法格式:

​ docker container cp 容器id:文件路径 本地路径

​ docker container cp 本地路径 容器id:文件路径

1.查看容器中文件路径
[root@docker01 ~]# docker run -it nginx /bin/bash
root@397a2ae54cea:/# ls /etc/nginx/
conf.d  fastcgi_params  koi-utf  koi-win  mime.types  modules  nginx.conf  scgi_params  uwsgi_params  win-utf

2.将容器的文件复制到本地
[root@docker01 ~]# docker container cp 8be3f16f3db0:/etc/nginx/nginx.conf .

3.将本地文件复制到容器
[root@docker01 ~]# docker container cp nginx.conf 8be3f16f3db0:/etc/nginx/nginx.conf

3.8.进入容器(exec)

容器肯定是第一次启动后,就不会再动他了,如果每次需要改配置还用docker run -it进入的话显然不是很合理,因此我们有两种方式进入容器

进入容器的目的:调式、排错

第一种attach方式(不太推荐)(始终使用同一个终端)
[root@docker01 ~]# docker attach 68e5215ceda5
不管会有多少个人进入容器始终是pts/0的终端,输入的命令是同步的,非常不合理,有人退出则都退出,容器也会随着死亡

第二种exec(分配一个新的终端)
格式:docker exec -it 容器id/容器名称 /bin/bash
[root@docker01 ~]# docker exec -it 68e5215ceda5 /bin/bash

attach

exec

3.9.查看docker容器运行过程中产生的日志

[root@docker01 centos69_ssh]# docker logs eloquent_pare 
Changing password for user root.
passwd: all authentication tokens updated successfully.

4.小案例-nginx容器配置know站点

1)准备文件和镜像

1.准备好相关文件
[root@docker02 ~]# ls docker_know/
know_system.tar.gz  nginx_docker_lastst.tar.gz

2.创建know站点配置文件
[root@docker02 docker_know]# cat know.conf
server 
    listen 80;
    server_name know.com;

    location / 
        root /web/know_system;
        index index.html;
    


3.导入nginx镜像
[root@docker02 docker_know]# docker load  -i nginx_docker_lastst.tar.gz 
13cb14c2acd3: Loading layer [==================================================>]  72.49MB/72.49MB
d4cf327d8ef5: Loading layer [==================================================>]   63.8MB/63.8MB
7c7d7f446182: Loading layer [==================================================>]  3.072kB/3.072kB
9040af41bb66: Loading layer [==================================================>]  4.096kB/4.096kB
f978b9ed3f26: Loading layer [==================================================>]  3.584kB/3.584kB
Loaded image: nginx:latest

4.启动镜像
[root@docker02 docker_know]# docker run -d -p 80:80 --name know_nginx nginx
4ee5a42706503136c3efbacb443331edfa0284b3ed4ec6fdcb22d1671d6b3205

如果遇到这种报错,则需要重启docker即可解决
[root@docker02 docker_know]# docker run -d -p 80:80 --name know_nginx nginx
3ce213c2ed910e299fd6e1207a2fd04677bdd718454fa85ab79460b10a7457ed
docker: Error response from daemon: driver failed programming external connectivity on endpoint know_nginx (6d438789fea2b1354a75d41de2154d17e89859cfb16ce30a8e9392abef8c9e53):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 80 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

2)配置nginx

1.查看容器id
[root@docker02 docker_know]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
4ee5a4270650        nginx               "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   know_nginx

2.将配置文件传到容器中
[root@docker02 docker_know]# docker cp know.conf 4ee5a4270650:/etc/nginx/conf.d/know.conf
将conf.d下面的default.conf改名字,不然待会影响访问
[root@docker02 docker_know]# docker exec -it 4ee5a4270650 /bin/bash
root@4ee5a4270650:/# cd /etc/nginx/conf.d/
root@4ee5a4270650:/etc/nginx/conf.d# ls
default.conf  know.conf
root@4ee5a4270650:/etc/nginx/conf.d# mv default.conf default.off 

3.创建web目录
[root@docker02 docker_know]# docker exec -it 4ee5a4270650 /bin/bash
root@4ee5a4270650:/# mkdir /web/
[root@docker02 docker_know]# docker cp know_system.tar.gz 4ee5a4270650:/web/know.tar.gz

4.解压站点
[root@docker02 docker_know]# docker exec -it 4ee5a4270650 /bin/bash
root@4ee5a4270650:/# cd /web/
root@4ee5a4270650:/web# tar xf know.tar.gz 
root@4ee5a4270650:/web# ls
know.tar.gz  know_system

5.重启nginx容器
[root@docker02 docker_know]# docker restart know_nginx 
know_nginx

6.访问

5.总结

docker容器的第一个进程必须一直处于前台运行状态,否则这个容器就会推出

以上是关于一文带你入门Docker容器服务 #yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#--docker容器快速入门

一文快速入门Docker

一文带你了解 TreeMap ,LinkedHashMap 的主要特点#yyds干货盘点#

#yyds干货盘点# 一文带你 RocketMQ 源码调试环境搭建

「Docker入门指北」容器很难理解?带你从头到尾捋一遍

一篇文章带你入门Docker + Nginx.