docker入门

docker 的入门学习笔记

Posted by Lerko on December 15, 2016

是时候用docker部署开发环境了 (ngixn apache ubuntu mysql memcache 。。。一应俱全)

docker的一些相关概念

镜像

  • docker images 查看
  • docker rmi <镜像id> 删除镜像

容器

  • docker ps 查看所有容器
  • docker rm <容器id> 删除容器
  • docker exec <容器id> 在容器中执行shell命令
  • docker restart <容器id> 重启容器
  • docker stop <容器id> 停止容器
  • docker kill <容器id> 强行杀死容器进程(一个容器一个进程)
  • docker start <容器id> 开始一个容器

远程仓库

  • 类似网易蜂巢这种就是一个远程的镜像仓库

运行第一个docker容器

  • 我们从网易蜂巢下载镜像
//https://c.163.com/hub#/m/repository/?repoId=3096
docker pull hub.c.163.com/library/busybox:latest
  • 然后运行镜像(运行一个交互的shell) –关闭后自动退出
# -i Keep STDIN open even if not attached(交互式的)
# -t Allocate a pseudo-TTY(有终端)
sudo docker run -i -t ubuntu /bin/bash
  • 运行一个长期运行的实例
# 开始一个长时间运行的docker实例 运行的是后面的那条shell
JOB=$(sudo docker run -d ubuntu /bin/sh -c "while true; do echo Hello world; sleep 1; done")

# Collect(收集) the output of the job so far  这里的$JoB也可以是容器的id
sudo docker logs $JOB

# Kill the job
sudo docker kill $JOB
  • 运行一个ssh 用主机链接

docker 的commit标示的是提交当前的状态 不然如果容器停止了就会恢复到原来的情况

# -d, --detach Run container in background and print container ID(保持后台守护运行)
# -p, --publish=[] Publish a container's port(s) to the host(分配端口)
# Hello! We are going to try and install openssh on a container and run it as a service
# let's pull ubuntu to get a base ubuntu image.
$ docker pull ubuntu
# I had it so it was quick
# now let's connect using -i for interactive and with -t for terminal
# we execute /bin/bash to get a prompt.
$ docker run -i -t ubuntu /bin/bash
# yes! we are in!
# now lets install openssh
$ apt-get update
$ apt-get install openssh-server
# ok. lets see if we can run it.
$ which sshd
# we need to create privilege separation directory
$ mkdir /var/run/sshd
$ /usr/sbin/sshd
$ exit
# now let's commit it
# which container was it?
$ docker ps -a |more
$ docker commit a30a3a2f2b130749995f5902f079dc6ad31ea0621fac595128ec59c6da07feea dhrp/sshd
# I gave the name dhrp/sshd for the container
# now we can run it again 这里表示的是吧sshd这个程序以守护进程的方式运行
# 如果不是守护进程的话如果ubuntu这个镜像没有程序运行,docker的容器就会退出进入停止状态
$ docker run -d dhrp/sshd /usr/sbin/sshd -D # D for daemon mode
# is it running?
$ docker ps
# yes!
# let's stop it
$ docker stop 0ebf7cec294755399d063f4b1627980d4cbff7d999f0bc82b59c300f8536a562
$ docker ps
# and reconnect, but now open a port to it
$ docker run -d -p 22 dhrp/sshd /usr/sbin/sshd -D
# 这里 port List port mappings or a specific mapping for the CONTAINER
# 标示端口列表映射或者一个特殊的端口映射到容器
$ docker port b2b407cf22cf8e7fa3736fa8852713571074536b1d31def3fdfcd9fa4fd8c8c5 22
# it has now given us a port to connect to
# we have to connect using a public ip of our host
$ hostname
# *ifconfig* is deprecated, better use *ip addr show* now
$ ifconfig
$ ssh root@192.168.33.10 -p 49153
# Ah! forgot to set root passwd
$ docker commit b2b407cf22cf8e7fa3736fa8852713571074536b1d31def3fdfcd9fa4fd8c8c5 dhrp/sshd
$ docker ps -a
$ docker run -i -t dhrp/sshd /bin/bash
$ passwd
$ exit
$ docker commit 9e863f0ca0af31c8b951048ba87641d67c382d08d655c2e4879c51410e0fedc1 dhrp/sshd
$ docker run -d -p 22 dhrp/sshd /usr/sbin/sshd -D
$ docker port a0aaa9558c90cf5c7782648df904a82365ebacce523e4acc085ac1213bfe2206 22
# *ifconfig* is deprecated, better use *ip addr show* now
$ ifconfig
$ ssh root@192.168.33.10 -p 49154
# Thanks for watching, Thatcher thatcher@dotcloud.com

docker 导入导出

导出

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
7691a814370e        ubuntu:14.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
$ sudo docker export 7691a814370e > ubuntu.tar

导入

$ cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

如何进入docker容器

刚开始使用docker的时候我完全不知道退出docker容器的命令行之后怎么和docker容器交互 于是找到了一个命令 docker exec 这个就是进入docker容器的一个途径 比如我们run一个ubuntu的bash docker run -itd ubuntu:laster /bin/bash 然后我们可以在docker ps中找到这个容器 我们就可以这样进入容器的命令行docker exec -it <容器的id或者别名> /bin/bash

docker中网络的配置

当docker运行的时候会产生一个docker0的网络节点 我们在使用docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式: host模式,使用–net=host指定。 container模式,使用–net=container:NAME_or_ID指定。 none模式,使用–net=none指定。 bridge模式,使用–net=bridge指定,默认设置。 默认选择bridge。

使用docker network inspect bridge可以查看当前桥接网络容器的ip状态

关于镜像的构成

参考文章:利用 commit 理解镜像构成

当我们run一个镜像 之后对镜像进行操作 会对文件造成更改 我们可以用docker diff <容器id或者别名> commit 之后就会产生一个新的镜像 docker images可以查看 docker history <image的名字>可以查看镜像的提交历史 这里要注意 commit不能不推荐用来制作镜像 因为这个是一种黑盒操作 我们并不知道在我们操作之后 镜像里面发生了什么变化 Dockerfile是一种推荐的制作镜像的方法

Dockerfile

制作镜像的推荐途径