docker

作者: 木子李_af14 | 来源:发表于2018-06-06 10:00 被阅读33次

以下内容总结自《第一本Docker书》,作者:[澳]James Turnbull

mac 下载docker.app

docker-for-mac https://docs.docker.com/docker-for-mac/#where-to-go-next
有些书籍可能会推荐下载docker toolbox,较新版的mac系统可以下载docker-for-mac,两者底层的依赖不一样。docker toolbox还是依赖的Oracle VirtualBox,而docker-for-mac是基于HyperKit。
官网教程:https://docs.docker.com/docker-for-mac/install/
进去之后,一键下载。

docker.app下载

照着教程安装一下,就可以执行下面命令尝试一下。

简单命令记录

$ docker --version
Docker version 18.03, build c97c6d6

$ docker-compose --version
docker-compose version 1.21.2, build 8dd22a9

$ docker-machine --version
docker-machine version 0.14.0, build 9ba6da9

# 查看已启动的docker镜像
$ docker container ls
$ docker ps 

# 查看已启动的 或 已关闭的 所有镜像
$ docker ps -a
$ docker container ls -a

# 查看已安装的镜像
$ docker image ls
# 删除已安装的镜像
$ docker image rm nginx

# 从仓库拉取fedora镜像(在冒号后面指定标签,可拉取固定的景象,默认是拉最新的)
$ docker pull fedora:20
# 查找镜像
$ docker search fedora

# 删除容器
$ docker container rm container_name
$ docker rm container_name

# 查看容器内的进程(container_name是容器名字)
$ docker top container_name

# 查看容器统计信息(下图)
$ docker stats container_name

# 查看容器更多的信息
$ docker inspect container_name
# 查看容器的IP地址(--format或-f 支持go语言模板的语法)
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name
容器统计信息

解决docker中Linux乱码的问题

保存立即生效

# 进入乱码的操作员的home目录
cd ~

# 编辑 .vimrc 文件,如果没有则新建
vi .vimrc

#设置tab分隔符为4个空格
set tabstop=4

#解决中文乱码的设置
set termencoding=utf-8
set encoding=prc

镜像image和容器container的区别

网上有很多比喻,这里摘几个来:

  • 一个镜像可以用于多个容器。一个镜像就像中间件,可以被多个容器同时使用。
  • A container is a stripped-to-basics version of a Linux operating system. An image is software you load into a container。
    容器就像是基础版的Linux操作系统,镜像就是你下载在操作系统中的软件。

镜像的实例化就是一个容器。
比如说你有以下镜像
jdk8的镜像:jdk8-image
jdk7的镜像:jdk7-image
git的镜像:git-image
svn的镜像:svn
maven3的镜像:mvn3-image

当你准备好了这些镜像,如果你要搭建一个jdk7+git+mvn3的环境,你只需要把你需要的镜像像搭积木一样搭建起来即可。
而且还有一个好处是,减少了环境带来的问题。咱们开发很容易碰到这样的场景:这代码在我那边明明运行的好好地。这也是在书中最早就提到的,docker诞生的原因之一。

docker container/image ps/ls 区别

  • 查看运行中的容器docker container lsdocker ps
    目前使用起来两者完全一样,docker container ls是后期加入到,加入了container显得更人性化一些,是在针对容器进行到操作。

  • 查看所有容器docker container ls -adocker ps -adocker container ps -a
    这行命令会展示正在运行中的以及已经关闭(exit)的容器。

  • 查看所有镜像docker imagesdocker image ls
    展示所有镜像

启动一个webserver

# 利用启动一个web服务(第一次启动,会去docker hub下载这个镜像,可能需要等一下)
$ docker run -d -p 80:80 nginx

# 指定名字启动nginx(否则docker会自动生成一个名字给你)
$ docker run -d -p 80:80 --name webserver nginx

# 根据镜像名字关闭镜像(也可通过镜像id)
$ docker container stop webserver

# 删除容器(镜像关闭之后,容器还是存在的,这个命令可以删除容器)
$ docker container rm webserver

启动成功后,地址栏访问localhost:80即可,展示如下:

webserver

删除所有容器

docker rm `docker ps -a -q`
删除所有容器

提交一个自己的容器(@deprecate)

目前docker团队,已经不建议使用commit创建镜像了,这里的记录只供学习,推荐使用Dockerfile
比如说需要给团队提供一个统一的镜像文件,这里假设说提供一个装有统一版本Apache2的Ubuntu系统镜像。
那我们就可以从docker仓库先拉一个下来,然后以交互的形式doker run -i -t ubuntu /bin/bash启动镜像,然后apt-get -y install apache2安装Apache2 。
到这一步,我们需要的镜像就已经完成了,剩下的commit和push,和git的版本控制是大同小异。

# 启动Ubuntu镜像
# -i 开启容易中的STDIN,保证持久的标准输入。-t 表示为创建的容器分配一个伪tty终端
# 这样新创建的容器才能提供一个交互式shell
$ docker run -i -t ubuntu /bin/bash

# 安装Apache2(安装完成后,退出即可)
$ apt-get -y install apache2

# 如果需要push到docker仓库的话,需要先登录
# 登录docker(在docker官网注册,需要翻墙)
$ docker login

# 查找制定的容器的ID
$ docker ps -l

# 提交制定的容器(同时会创建一个新的镜像,名字为anthony/ubuntu)
$ docker commit 89dde2ef6166 anthonyxu/ubuntu

# push到远程docker仓库
$ docker push anthonyxu/ubuntu
登录成功 查看制定的容器ID 将镜像推送到docker仓库

使用Dockerfile构建镜像

  1. 首先准备一个Dockerfile文件,该文件里面包含了一系列用于构建镜像的指令。
  2. 执行docker build -t="仓库名/镜像名" .构建镜像
# 创建一个目录,并新建一个Dockerfile文件
$ mkdir dockers
$ cd dockers
$ touch Dockerfile

# 编辑Dockerfile文件
$ vim Dockerfile

# 构建新的镜像,也可以用-f,指定构建源文件路径 -f xxx/xxx/xxx
docker build -t="anthonyxu/static_web" .

Dokerfile文件内容:

# Dockerfile笔记
# Dockerfile是由一系列指令和参数组成,每条指令,都必须全都大写。
# 每条指令,都会创建一个新的镜像层并对镜像进行提交
# 第一条指令必须是FROM

# 下面是版本注释
# Version: 0.0.1

# FROM指令:指定一个已经存在对镜像,后面指令都是基于该镜像进行对,这个镜像被称为基础镜像
FROM ubuntu:latest

# MAINTAINER 作者 邮箱
MAINTAINER anthonyXu "xxx@xxx.com"

# RUN指令,会在当前镜像中运行指定命令
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hi, i am in your container ' > /usr/share/nginx/html/index.html

# EXPOSE指令,告诉docker,该容器内对应用程序将会使用容器对指定端口。
# 出于安全考虑,docker不会自动打开该端口。
# 需要用户在run的时候,指定需要打开的端口,所以这里EXPOSE指令,可以指定多个端口。
EXPOSE 80

docker build日志:

admin@anthony:~/dockers$  docker build -t="anthonyxu/static_web" .
Sending build context to Docker daemon   2.56kB
Step 1/5 : FROM ubuntu:latest
 ---> 452a96d81c30
Step 2/5 : MAINTAINER anthonyXu "xxx@xxx.com"
 ---> Running in b1dfca10ec1d
Removing intermediate container b1dfca10ec1d
 ---> 2990b0f6086d
Step 3/5 : RUN apt-get update && apt-get install -y nginx
 ---> Running in b56d0fcd7876

此处省略。。。。。。。。

 ---> b251410f1071
Step 4/5 : RUN echo 'Hi, i am in your container ' > /usr/share/nginx/html/index.html
 ---> Running in 54ad9e8e6f06
Removing intermediate container 54ad9e8e6f06
 ---> b8bfae7c5388
Step 5/5 : EXPOSE 80
 ---> Running in 8c8981c63be7
Removing intermediate container 8c8981c63be7
 ---> b95a17d5f7be
Successfully built b95a17d5f7be
Successfully tagged anthonyxu/static_web:latest

如何跳过docker缓存:docker build的过程中,每一步的构建过程都会将结果提交为镜像。它会将之前的镜像层看作缓存。如果Dockerfile中的有1-5条指令,修改了第4条指令,需要再次构建时,docker会跳过1-3条指令,直接从第4条开始;但如果第1-3条指令有修改,当重新构建时,还是会从第1条开始执行。另外,如果不想使用docker的缓存,可以使用命令:docker build --no-cache -t="xxx/xx"

  1. 从新镜像启动该容器
    启动镜像还是以docker run命令,-d选项告诉docker以分离(detached)的方式在后台运行,这比较适合运行类似nginx守护进程这样的需要长时间运行的进程。 -p选项控制docker在运行时应该公开哪些端口给外部宿主机(会在宿主机上随机打开一个端口(32768~61000之间))这个端口会映射到容器的80端口。
    docker ps可以查看端口映射,如下所见0.0.0.0:32768->80/tcp,容器的80端口被映射到了宿主机的32768端口上。
admin@anthony:~/conf/zdal$  docker run -d -p 80 --name static_web anthonyxu/static_web nginx -g "daemon off;"
473b9f061142c510ed8974fe0cc0487bc9b969a996e4536c8a55b5acacdfe434

admin@anthony:~/conf/zdal$  docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED              STATUS              PORTS                   NAMES
473b9f061142        anthonyxu/static_web   "nginx -g 'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:32768->80/tcp   static_web

如何绑定到宿主机哪个端口:通过-p选项,如docker run -d -p 8080:80 后面省略,这条命令会将容器中到80端口绑定到宿主机到8080端口。重点!因为宿主机8080端口被占用,那在宿主机上运行到服务将无法绑定8080端口,另外的容器也无法绑定8080端口。
如何绑定到特定网络接口:命令docker run -d -p 127:0:0:1:8080:80 省略后面
如何绑定到随机端口:命令docker run -d -p 127:0:0:1::80 省略后面

  1. 访问nginx页面
    浏览器中直接访问http://localhost:80或者http://localhost:32768

将构建完成到镜像推送到Docker hub

当镜像构建完成后,可以将它上传到Docker hub,这样其他人就可以使用该镜像。
推送命令:docker push static_web anthonyxu/static_web其中anthonyxu是用户名,static_web是仓库名,推送成功后,可以登录https://hub.docker.com/查看。

admin@anthony:~/dockers$  docker push anthonyxu/static_web
The push refers to repository [docker.io/anthonyxu/static_web]
d33a335f1738: Pushed
f945ea2bd62f: Pushed
059ad60bcacf: Mounted from anthonyxu/ubuntu
8db5f072feec: Mounted from anthonyxu/ubuntu
67885e448177: Mounted from anthonyxu/ubuntu
ec75999a0cb1: Mounted from anthonyxu/ubuntu
65bdd50ee76a: Mounted from anthonyxu/ubuntu
latest: digest: sha256:fab3b575457c17098f476fd9cbb44e753608ddeb9461c2820d2b5559c17fdb50 size: 1776
docker仓库上的镜像

相关文章

  • docker学习

    docker镜像 docker容器 docker仓库 安装docker docker版本 docker分为社区版和...

  • Docker安装和运行

    获取Docker 安装Docker 验证安装 1、获取Docker Docker for Mac Docker f...

  • Docker知识手册

    Docker 容器 启动docker:docker start 查看docker运行状态:docker stats...

  • Docker简介

    章节介绍 # Docker是什么# Docker包括什么# Docker镜像# Docker编配# Docker还...

  • Docker 常用操作

    Docker docker: 18.09.4、nvidia-docker: 2.0.3 docker 19.03 ...

  • rancher+harbor离线安装

    安装docker,此docker为社区版docker。docker官方文档:https://docs.docker...

  • Linux之Docker

    Linux之Docker 目录 Docker简单介绍 在线Docker安装 离线Docker安装 Docker简单...

  • Docker常用命令

    Docker常用命令 Docker帮助命令 docker version:查看docker版本 docker in...

  • Docker基础操作

    Docker部署 Docker安装 镜像加速 Docker 基础命令 Docker镜像管理 搜索镜像docker ...

  • docker容器状态查看命令集

    docker inspect 用法 : docker inspect [docker名称/docker short...

网友评论

      本文标题:docker

      本文链接:https://www.haomeiwen.com/subject/ufnvsftx.html