Docker你需要知道的知识点--镜像和容器

464 阅读5分钟

在正文的第一句加入: 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

目前随着CICD的普及,Docker 的应用也越来越多,为了开发环境和部署环境的统一,公司也开始要求前端在Docker基础上进行项目开发,于是乎最近也开始研究Docker, 这里把学习的docker知识分享下,希望我分享的内容能够帮大家对Docker有个更好的理解,让我们一起学习交流,一起加油!

镜像的使用

拉取镜像

docker pull [选项] [Docker Registry 地址[:端口号]/] 仓库名[:标签]

### [Docker Registry 地址[:端口号]/] 默认地址是 Docker Hub(docker.io)。
### [仓库名[:标签] 默认是 用户名/ 软件名  默认的是library/ubantu

## 如果省略tag 默认就是latest
macC02ZV010LVDM:~ xxx$ docker pull jwilder/nginx-proxy

Using default tag: latest
latest: Pulling from jwilder/nginx-proxy
latest: Pulling from jwilder/nginx-proxy
latest: Pulling from jwilder/nginx-proxy
e1acddbe380c: Already exists
e21006f71c6f: Already exists
f3341cc17e58: Already exists
2a53fa598ee2: Already exists
12455f71a9b5: Already exists
b86f2ba62d17: Already exists
a1279b75471a: Pull complete
83aab59390ea: Pull complete
94ef1be361a9: Pull complete
882b879fc0fa: Pull complete
c2f7bc730867: Pull complete
e38a661d96c0: Pull complete
Digest: sha256:cccf3a6a7ae590997e67d6a91ce807f6dbc8b04425a7587bb7ea55574da7e882
Status: Downloaded newer image for jwilder/nginx-proxy:latest
docker.io/jwilder/nginx-proxy:latest

##成功pull后 查看镜像
docker images 

运行容器

容器创建:docker create

## docker create 来创建容器
macCZV011LVDM:~ xxxx$ docker create nginx:1.12
36ebc207efc63d62b7add36c6aa7546cfc77a7091c789fea6c8da77b53c4e508

## -- name 来指定名称
macC0211LVDM:~ xx$ docker create --name nginx nginx:1.12
efb29b958fd6a15590af8440d24e3685b4933b47a568c424604b50bf9473934a

macCZV011LVDM:~ xx$ docker ps -a

CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS                      PORTS     NAMES
efb29b958fd6   nginx:1.12   "nginx -g 'daemon of…"   5 seconds ago   Created                               nginx
d2348fc58ed8   mongo        "docker-entrypoint.s…"   2 months ago    Exited (0) 2 months ago               mongo
d178457f382a   alpine/git   "git clone https://g…"   3 months ago    Exited (128) 3 months ago             repo

容器运行: docker start 和 docker run

macC02ZV0VDM:~ xxx$ docker start nginx
nginx

macC02ZLVDM:~ xxx$ docker ps -a
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS                      PORTS     NAMES
efb29b958fd6   nginx:1.12   "nginx -g 'daemon of…"   3 minutes ago   Up 8 seconds                80/tcp    nginx
d2348fc58ed8   mongo        "docker-entrypoint.s…"   2 months ago    Exited (0) 2 months ago               mongo
d178457f382a   alpine/git   "git clone https://g…"   3 months ago    Exited (128) 3 months ago             repo
macC02ZV010LVDM:~ wangvin$


## 可以采取 create + start 的结合命令 run , 需要添加-d  不然就是前台运行
macC02ZLVDM:~ xxx$ docker run --name nginx -d nginx:1.12

镜像的查看:

##docker images ,docker image ls 列出所有的顶层镜像
docker images

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
alpine/git   latest    b8f176fa3f0d   3 months ago   25.1MB
vinc/mongo   latest    07630e791de3   3 months ago   449MB

## imageID 只显示了12位
## vinc/mongo  username:vinc  repository:mongo tag:latest ,  没有username的表示docker官方维护的

##docker image ls -a 会列出所有的镜像包括中间层镜像

##docker image ls ubantu 根据仓库名列出镜像

##docker image ls ubuntu:18.04列出特定的某个镜像,也就是说指定仓库名和标签

##docker image ls -f since=mysql:5.7 列出mysql:5.7 之后建立的镜像

搜索images:

docker search xxx:会在dockerHub中搜索镜像

macC02ZV010LVDM:~ xxx$ docker search nginx

NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15364     [OK]
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   2060                 [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   816                  [OK]
jc21/nginx-proxy-manager          Docker container for managing Nginx proxy ho…   236
linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   152
tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp…   139                  [OK]
jlesage/nginx-proxy-manager       Docker container for Nginx Proxy Manager        132                  [OK]
alfg/nginx-rtmp                   NGINX, nginx-rtmp-module and FFmpeg from sou…   105                  [OK]
nginxdemos/hello                  NGINX webserver that serves a simple page co…   71                   [OK]
privatebin/nginx-fpm-alpine       PrivateBin running on an Nginx, php-fpm & Al…   56                   [OK]
nginx/nginx-ingress               NGINX and  NGINX Plus Ingress Controllers fo…   55
nginxinc/nginx-unprivileged       Unprivileged NGINX Dockerfiles                  46
staticfloat/nginx-certbot         Opinionated setup for automatic TLS certs lo…   24                   [OK]

查看详细镜像详情:

docker inspect xxx 

虚悬镜像:

每个镜像都有自己的名称和tag,但是随着官网的维护,发布了新版本后,重新pull镜像,则旧的镜像的名称和tag就会被移除变成了 。如下

<none>               <none>              00285df0df87        5 days ago          342 MB

可以使用 docker image prune删除这些没有意义的镜像

删除镜像

## docker image rm [选项] <镜像1> [<镜像2> ...]

## 如果image id 是0584b3d2cf6d 
docker image rm 0584b3d2cf6d 

## 由于image id 很长,所有可以摘取部分id作为特殊的标识符(只要是这个image id的唯一标识符就行),例如可以
docker image rm 05

## 我们也可以用镜像名,也就是 <仓库名>:<标签>,来删除镜像
docker image rm mysql:5.7

容器的启动和停止

容器创建

## docker create 来创建容器
macCZV011LVDM:~ xxxx$ docker create nginx:1.12

## -- name 来指定名称
macC0211LVDM:~ xx$ docker create --name nginx nginx:1.12

容器运行

## docker start 容器启动
docker start nginx

## 也可以采取 create + start 的结合命令 run , 需要添加-d  不然就是前台运行
docker run --name nginx -d nginx:1.12

## 运行一个mysql的容器 然后输出hello world 然后停止容器
docker run mysql:5.7 /bin/echo 'Hello world'


进入容器

## 通过bash -it 来进入容器, -i 保持输入流,-t 创建一个伪终端,才能看到运行的结果, ctrol+d退出
docker exec -it nginx   /bin/bash
## 进入了容器内部 输入ls命令
root@efb29b958fd6:/# ls

容器后台运行

## -d 就可以让Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下, 输出在容器内部
docker run nginx /bin/sh -c "while cc"

## 通过docker  logs  [container ID or NAMES] 来查看里面的输出
docker logs nginx1

容器终止

##可以使用 docker container stop 来终止一个运行中的容器
docker container stop nginx1

容器的删除

## 可以使用 docker container rm 来删除一个处于终止状态的容器
docker container rm nginx1

## 如果要删除一个正在运行的容器 可以使用 -f
docker container -f rm nginx1

容器的网络

容器的网络是一个独立的沙盒环境,有自己的内部网络,容器的网络有下列五种类型

  • Bridge: Docker 的默认网络类型,通过网桥的方式来实现通讯
  • Host:通过以Docker容器为host的网络通讯方式
  • OverLay:借助Docker Swarm来搭建虚拟网络
  • MacLan:分配MAC地址到每个容器的虚拟网络节点
  • None:禁用容器的所有的网络服务

容器网络的创建

## docker network create 来创建一个网络
docker network create -d bridge new-network

容器链接

## --network 在容器后面加这个参数来链接网络 
## 创建nginx1 链接容器new-network
docker run -it -rm nginx1 --network new-network

## 创建nginx2 链接容器new-network
docker run -it -rm nginx2 --network new-network

## 这样两个容器就链接到一个网络上了,可以在nginx1中通过ping nginx2 来验证他们属于一个网络

容器映射端口

在Bridge网络中容器也可以通过暴露自己的端口的方式来让外部容器

## 通过 -p [宿主端]:[容器端口] ,这样就通过宿主机的端口访问容器的里面的端口
docker run -d --name nginx3 -p 80:80 nginx:1.8

相关资料

大家喜欢的可以看看我的专栏 (Docker你需要知道的知识点) 我会尽量保持每周更新,如果喜欢的麻烦帮我点个赞,十分感谢

大家如果喜欢“Typescript”的话,可以看看我分享的另外一个专栏(TypeScript常用知识)里面有常见的Typescript知识点分享,希望帮大家更好的理解TS的意义

大家如果喜欢“算法”的话,可以看看我分享的另外一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能帮助大家更深的理解算法

文章内容目的在于学习讨论与分享学习TS过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com