Docker 学习

入门docker看阮一峰老师的两篇就入门了,这里做下笔记

http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

http://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html

 

虚拟机的缺点

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

(1)资源占用多

虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

(2)冗余步骤多

虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

(3)启动慢

启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

 

容器优点

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

(1)启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

 

Docker 用途

Docker 的主要用途,目前有三大类。

(1)提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。

(2)提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

 

 

Ubuntu docker安装

sudo apt-get install -y telnet gcc make vim net-tools tree rar aptitude manpages-posix-dev libltdl3-dev lrzsz bridge-utils ipvsadm openssh-server ipvsadm git 

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

sudo curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

sudo apt-cache policy docker-ce

sudo apt-get install -y docker-ce

docker version

sudo systemctl start docker

sudo systemctl enable docker

sudo vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://o68hnxvo.mirror.aliyuncs.com"]
}

sudo systemctl daemon-reload

sudo systemctl restart docker

ps -ef| grep docker| grep -v grep

docker-compose version

# install go-land

wget https://dl.google.com/go/go1.11.6.linux-amd64.tar.gz

sudo tar -zxvf go1.11.6.linux-amd64.tar.gz -C /usr/local/

mkdir $HOME/go

go env

vim /etc/profile

export GOROOT="/usr/local/go"
export GOPATH="$HOME/go"
export GOBIN="$HOME/go/bin"
export PATH="$PATH:$GOROOT/bin:$GOPATH/bin"
export NODEJS_HOME="/usr/local/node-v8.11.4-linux-x64"
export PATH="$PATH:$NODEJS_HOME/bin"

# install hyperledger

mkdir hyperledger && cd hyperledger

git clone https://github.com/hyperledger/fabric-samples.git

curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.4.1 1.4.1 0.4.15

 

Docker概念:

0x00  微服务,服务模块化

0x01  image相当于类, container 相当于对象,可自定义镜像

0x02  类似github,可以登录push 和 pull

0x03  可以映射端口和目录到本地,docker使用局域网IP

0x04  超低开销,性能优,启动快

 

 

Docker 常用命令

docker ps -a  查看容器状态

docker container 

      ls   查看容器

     run  新开一个容器

      start 打开已有容器

      stop  关闭容器

      rm   删除容器

      stats 运行状态

      port 查看端口映射

      commit 提交变化到镜像

      cp  在容器和本机之间拷贝文件

      kill 杀死容器

      logs 查看容器输出

     diff 检查容器文件变化

      exec 在容器上执行命令

     inspect 容器详情

      top 查看容器运行进程

      prune 移除所有暂停的容器

      export 导出容器文件系统为压缩包

 

docker container run 常用参数-d 后台运行

--rm  一次性容器
--it  指定镜像
-p  端口映射 8080:80
-name 容器名
--volume 文件映射
--env USERNMAE=root 设置容器环境变量
--link wordpress-mysql:mysql 连接其他容器
--ite 交互式状态
image:tag

/etc/bash

 

 https://www.jb51.net/article/154031.htm

 

docker image 

    build 构建一个镜像
    history 查看镜像历史
    import 导入创建镜像
    inspect 查看镜像详情
    load 从压缩包或者标准输入中加载镜像
    ls 查看所有镜像
    prune 移除未使用的镜像
    pull 拉取个人镜像
    push 推送个人镜像
    rm 删除镜像
    save 保存镜像到压缩包
    tag 为镜像打标签

 

编写 Dockerfile 文件

.dockerignore

.git
node_modules
npm-debug.log

不打包进入 image 的文件

 

Dockerfile

FROM node:8.4
COPY . /app
WORKDIR /app
RUN npm install --registry=https://registry.npm.taobao.org
EXPOSE 3000
  • ROM node:8.4:该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的 node。
  • COPY . /app:将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
  • WORKDIR /app:指定接下来的工作路径为/app
  • RUN npm install:在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
  • EXPOSE 3000:将容器 3000 端口暴露出来, 允许外部连接这个端口。
docker image build -t koa-demo .


10.5 发布 image 文件

容器运行成功后,就确认了 image 文件的有效性。这时,我们就可以考虑把 image 文件分享到网上,让其他人使用。

首先,去 hub.docker.com 或 cloud.docker.com 注册一个账户。然后,用下面的命令登录。


$ docker login

接着,为本地的 image 标注用户名和版本。


$ docker image tag [imageName] [username]/[repository]:[tag]
# 实例
$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1

也可以不标注用户名,重新构建一下 image 文件。


$ docker image build -t [username]/[repository]:[tag] .

最后,发布 image 文件。


$ docker image push [username]/[repository]:[tag]

发布成功以后,登录 hub.docker.com,就可以看到已经发布的 image 文件。

 

 

(1)docker container start

前面的docker container run命令是新建容器,每运行一次,就会新建一个容器。同样的命令运行两次,就会生成两个一模一样的容器文件。如果希望重复使用容器,就要使用docker container start命令,它用来启动已经生成、已经停止运行的容器文件。


$ docker container start [containerID]

(2)docker container stop

前面的docker container kill命令终止容器运行,相当于向容器里面的主进程发出 SIGKILL 信号。而docker container stop命令也是用来终止容器运行,相当于向容器里面的主进程发出 SIGTERM 信号,然后过一段时间再发出 SIGKILL 信号。


$ bash container stop [containerID]

这两个信号的差别是,应用程序收到 SIGTERM 信号以后,可以自行进行收尾清理工作,但也可以不理会这个信号。如果收到 SIGKILL 信号,就会强行立即终止,那些正在进行中的操作会全部丢失。

(3)docker container logs

docker container logs命令用来查看 docker 容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。


$ docker container logs [containerID]

(4)docker container exec

docker container exec命令用于进入一个正在运行的 docker 容器。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令进入容器。一旦进入了容器,就可以在容器的 Shell 执行命令了。


$ docker container exec -it [containerID] /bin/bash

(5)docker container cp

docker container cp命令用于从正在运行的 Docker 容器里面,将文件拷贝到本机。下面是拷贝到当前目录的写法。


$ docker container cp [containID]:[/path/to/file] .


4.2 Docker Compose 的安装

Mac 和 Windows 在安装 docker 的时候,会一起安装 docker compose。Linux 系统下的安装参考官方文档

安装完成后,运行下面的命令。


$ docker-compose --version

4.3 WordPress 示例

docker-demo目录下,新建docker-compose.yml文件,写入下面的内容。


mysql:
    image: mysql:5.7
    environment:
     - MYSQL_ROOT_PASSWORD=123456
     - MYSQL_DATABASE=wordpress
web:
    image: wordpress
    links:
     - mysql
    environment:
     - WORDPRESS_DB_PASSWORD=123456
    ports:
     - "127.0.0.3:8080:80"
    working_dir: /var/www/html
    volumes:
     - wordpress:/var/www/html

上面代码中,两个顶层标签表示有两个容器mysqlweb。每个容器的具体设置,前面都已经讲解过了,还是挺容易理解的。

启动两个容器。


$ docker-compose up

浏览器访问 http://127.0.0.3:8080,应该就能看到 WordPress 的安装界面。

现在关闭两个容器。


$ docker-compose stop

关闭以后,这两个容器文件还是存在的,写在里面的数据不会丢失。下次启动的时候,还可以复用。下面的命令可以把这两个容器文件删除(容器必须已经停止运行)。


$ docker-compose rm
 
posted @ 2019-06-04 17:42  Khazix  阅读(260)  评论(0编辑  收藏  举报