原始需求

  • 构建本地镜像
  • 编写 Dockerfile 将httpserver 容器化
  • 将镜像推送至 docker 官方镜像仓库
  • 通过 docker 命令本地启动 httpserver
  • 通过 nsenter 进入容器查看 IP 配置

HttpServer代码

之前已经写过代码:使用Go语言编写Http Server

package mainimport ("fmt""os""strconv"//"github.com/thinkeridea/go-extend/exnet""io""log""net/http""strings"
)/*1,接收客户端 request,并将 request 中带的 header 写入 response header2,读取当前系统的环境变量中的 VERSION 配置,并写入 response header3,Server 端记录访问日志包括客户端 IP,HTTP 返回码,输出到 server 端的标准输出4,当访问 localhost/healthz 时,应返回 200
*/// Main方法入口
func main() {println("环境正常")// 功能1http.HandleFunc("/requestAndResponse", requestAndResponse)// 功能2http.HandleFunc("/getVersion", getVersion)// 功能3http.HandleFunc("/ipAndStatus", ipAndStatus) //注册接口句柄// 功能4http.HandleFunc("/healthz", healthz) //注册接口句柄err := http.ListenAndServe(":81", nil) //监听空句柄,80端口被占用,使用81端口if nil != err {log.Fatal(err) //显示错误日志}
}// 功能1,接收请求及响应
func requestAndResponse(response http.ResponseWriter, request *http.Request) {println("调用requestAndResponse接口")headers := request.Header //header是Map类型的数据println("传入的hander:")for header := range headers { //value是[]string//println("header的key:" + header)values := headers[header]for index, _ := range values {values[index] = strings.TrimSpace(values[index])//println("index=" + strconv.Itoa(index))//println("header的value:" + values[index])}//valueString := strings.Join(values, "")//println("header的value:" + valueString)println(header + "=" + strings.Join(values, ","))        //打印request的header的k=vresponse.Header().Set(header, strings.Join(values, ",")) // 遍历写入response的Header//println()}fmt.Fprintln(response, "Header全部数据:", headers)io.WriteString(response, "succeed")}// 功能2,获取环境变量的version
func getVersion(response http.ResponseWriter, request *http.Request) {println("调用getVersion接口")envStr := os.Getenv("VERSION")//envStr := os.Getenv("HADOOP_HOME")//println("系统环境变量:" + envStr) //可以看到 C:\soft\hadoop-3.3.1    Win10需要重启电脑才能生效response.Header().Set("VERSION", envStr)io.WriteString(response, "succeed")}// 功能3,输出IP与返回码
func ipAndStatus(response http.ResponseWriter, request *http.Request) {println("调用ipAndStatus接口")form := request.RemoteAddrprintln("Client->ip:port=" + form) //虚拟机是桥接模式。使用postman返回的全部是127.0.0.1 用手机打开网站192.168.1.139:81/ipAndStatus可以看到新IPipStr := strings.Split(form, ":")println("Client->ip=" + ipStr[0]) //打印ip// 获取http响应码//response.WriteHeader(301) //手动设置响应码,默认200//response.WriteHeader(http.StatusOK)//由于默认是调用这个,∴返回码都是这个200【server.go有源码】println("Client->response code=" + strconv.Itoa(http.StatusOK))//println("response code->:" + code)io.WriteString(response, "succeed")
}// 功能4,连通性测试接口
func healthz(response http.ResponseWriter, request *http.Request) {println("调用healthz接口")response.WriteHeader(200) //设置返回码200//response.WriteHeader(http.StatusOK)//默认会调用这个方法,默认就是200【server.go有源码】io.WriteString(response, "succeed")
}

Ubuntu安装Go

Last login: Tue May  3 20:22:13 2022 from 192.168.88.1
zhiyong@zhiyong-vm-dev:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.88.50  netmask 255.255.255.0  broadcast 192.168.88.255inet6 fe80::e89d:a89:8f8f:9304  prefixlen 64  scopeid 0x20<link>ether 00:0c:29:56:16:b5  txqueuelen 1000  (以太网)RX packets 892  bytes 721182 (721.1 KB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 694  bytes 97876 (97.8 KB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0inet6 ::1  prefixlen 128  scopeid 0x10<host>loop  txqueuelen 1000  (本地环回)RX packets 218  bytes 20407 (20.4 KB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 218  bytes 20407 (20.4 KB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0zhiyong@zhiyong-vm-dev:~$ go
Command 'go' not found, but can be installed with:
sudo snap install go         # version 1.17.6, or
sudo apt  install golang-go  # version 2:1.16~0ubuntu1
sudo apt  install gccgo-go   # version 2:1.16~0ubuntu1
See 'snap info go' for additional versions.
zhiyong@zhiyong-vm-dev:~$ sudo apt  install golang-go
升级了 0 个软件包,新安装了 33 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 212 MB 的归档。
解压缩后会消耗 844 MB 的额外空间。
您希望继续执行吗? [Y/n] y
zhiyong@zhiyong-vm-dev:~$ go version
go version go1.17 linux/amd64

Ubuntu编译Go代码

先检查81端口占用情况:

win中使用:

C:\Users\zhiyong>netstat -ano | findstr "81"
C:\Users\zhiyong>taskkill -f -pid 这里写PID号

杀进程。Goland做Debug就很方便。

Ubuntu使用:

zhiyong@zhiyong-vm-dev:~$ mkdir -p dockerstudy/httpserver/go
zhiyong@zhiyong-vm-dev:~$ cd /home/zhiyong/dockerstudy/httpserver/go/
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ ll
总用量 8
drwxrwxr-x 2 zhiyong zhiyong 4096  5月  5 00:02 ./
drwxrwxr-x 3 zhiyong zhiyong 4096  5月  5 00:02 ../
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ sudo apt install vim
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ vim main.go
# 将Go代码写进去zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ ll
总用量 12
drwxrwxr-x 2 zhiyong zhiyong 4096  5月  5 00:07 ./
drwxrwxr-x 3 zhiyong zhiyong 4096  5月  5 00:02 ../
-rw-rw-r-- 1 zhiyong zhiyong 3559  5月  5 00:07 main.go
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ netstat -atunlp | grep 81
(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)
udp        0      0 0.0.0.0:52981           0.0.0.0:*                           -
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ sudo go build -o gohttpserver main.go
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ ll
总用量 6000
drwxrwxr-x 2 zhiyong zhiyong    4096  5月  5 00:09 ./
drwxrwxr-x 3 zhiyong zhiyong    4096  5月  5 00:02 ../
-rwxr-xr-x 1 root    root    6128735  5月  5 00:09 gohttpserver*
-rw-rw-r-- 1 zhiyong zhiyong    3559  5月  5 00:07 main.go
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ ./gohttpserver
环境正常
2022/05/05 00:09:19 listen tcp :81: bind: permission denied
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ sudo ./gohttpserver
环境正常

另一个黑窗口:

zhiyong@zhiyong-vm-dev:~$ netstat -atunlp | grep 81
(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)
tcp6       0      0 :::81                   :::*                    LISTEN      -
udp        0      0 0.0.0.0:52981           0.0.0.0:*                           -
zhiyong@zhiyong-vm-dev:~$ sudo netstat -atunlp | grep 81
[sudo] zhiyong 的密码:
tcp6       0      0 :::81                   :::*                    LISTEN      12367/./gohttpserve
udp        0      0 0.0.0.0:52981           0.0.0.0:*                           834/avahi-daemon: r

可以看到进程启动。

浏览器访问:

http://192.168.88.50:81/healthz

显示文字succeed,说明编译成功,且该编译后的可执行程序在Ubuntu可以正常使用。

结束程序:

zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver/go$ sudo ./gohttpserver
环境正常
调用healthz接口
^C
zhiyong@zhiyong-vm-dev:~$ sudo netstat -atunlp | grep 81
tcp6       0      0 192.168.88.50:81        192.168.88.1:49547      TIME_WAIT   -
udp        0      0 0.0.0.0:52981           0.0.0.0:*                           834/avahi-daemon: r

Ubuntu安装Docker

zhiyong@zhiyong-vm-dev:~$ docker
Command 'docker' not found, but can be installed with:
sudo snap install docker     # version 20.10.11, or
sudo apt  install docker.io  # version 20.10.12-0ubuntu2~21.10.1
See 'snap info docker' for additional versions.
zhiyong@zhiyong-vm-dev:~$ sudo apt  install docker.io
zhiyong@zhiyong-vm-dev:~$ sudo apt  install docker.io
[sudo] zhiyong 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
下列软件包是自动安装的并且现在不需要了:libfwupdplugin1 linux-headers-5.13.0-30 linux-headers-5.13.0-30-generic linux-image-5.13.0-30-generic linux-modules-5.13.0-30-genericlinux-modules-extra-5.13.0-30-generic
使用'sudo apt autoremove'来卸载它(它们)。
将会同时安装下列软件:bridge-utils containerd git git-man liberror-perl pigz runc ubuntu-fan
建议安装:ifupdown aufs-tools btrfs-progs cgroupfs-mount | cgroup-lite debootstrap docker-doc rinse zfs-fuse | zfsutils git-daemon-run | git-daemon-sysvinit git-docgit-email git-gui gitk gitweb git-cvs git-mediawiki git-svn
下列【新】软件包将被安装:bridge-utils containerd docker.io git git-man liberror-perl pigz runc ubuntu-fan
升级了 0 个软件包,新安装了 9 个软件包,要卸载 0 个软件包,有 0 个软件包未被升级。
需要下载 70.1 MB 的归档。
解压缩后会消耗 315 MB 的额外空间。
您希望继续执行吗? [Y/n] y

注册Docker Hub

https://hub.docker.com/

构建镜像

拉取Ubuntu镜像:

zhiyong@zhiyong-vm-dev:~$ docker pull ubuntu
Using default tag: latest
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImage=ubuntu&tag=latest": dial unix /var/run/docker.sock: connect: permission denied
zhiyong@zhiyong-vm-dev:~$ sudo docker pull ubuntu
[sudo] zhiyong 的密码:
Using default tag: latest
latest: Pulling from library/ubuntu
125a6e411906: Pull complete
Digest: sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68d
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest
zhiyong@zhiyong-vm-dev:~$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
zhiyong@zhiyong-vm-dev:~$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
ubuntu       latest    d2e4e1f51132   4 days ago   77.8MB

启动Ubuntu镜像:

zhiyong@zhiyong-vm-dev:~$ sudo docker run -ti ubuntu /bin/bash
root@c515a662d46c:/# pwd
/
root@c515a662d46c:/# vim test.txt
bash: vim: command not found    #需要安装vim
root@c515a662d46c:/# apt-get update
root@c515a662d46c:/# apt-get -y install vim
root@c515a662d46c:/# exit
exit
zhiyong@zhiyong-vm-dev:~$ sudo docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                      PORTS     NAMES
c515a662d46c   ubuntu    "/bin/bash"   11 minutes ago   Exited (0) 39 seconds ago             goofy_heisenberg
zhiyong@zhiyong-vm-dev:~$ sudo docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
ubuntu       latest    d2e4e1f51132   4 days ago   77.8MB
zhiyong@zhiyong-vm-dev:~$ sudo docker commit -m="add vim" -a="zhiyong" c515a662d46c ubuntuwithvm
sha256:428e030662bc465ce126cf3a9e726b1be34219583c1200865ad11e89a16b961a
zhiyong@zhiyong-vm-dev:~$ sudo docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
ubuntuwithvm   latest    428e030662bc   14 seconds ago   170MB
ubuntu         latest    d2e4e1f51132   4 days ago       77.8MB

DockerFile内容:

FROM ubuntu
RUN echo '这是一个基于ubuntu且应用为httpserver的镜像' && mkdir -p /dockerstudy/httpserver
COPY go/gohttpserver /dockerstudy/httpserver/
#此处source路径必须是相对路径,使用绝对路径会报错COPY failed: file not found in build context or excluded by .dockerignore: stat /home/zhiyong/dockerstudy/httpserver/go/gohttpserver: file does not existENTRYPOINT ["/dockerstudy/httpserver/gohttpserver"]

构建命令:

zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ pwd
/home/zhiyong/dockerstudy/httpserver
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ vim Dockerfile
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker build -t gohttpserver:v1 .
Sending build context to Docker daemon  6.136MB
Step 1/4 : FROM ubuntu---> d2e4e1f51132
Step 2/4 : RUN echo '这是一个基于ubuntu且应用为httpserver的镜像' && mkdir -p /dockerstudy/httpserver---> Using cache---> 78301d6519e6
Step 3/4 : COPY go/gohttpserver /dockerstudy/httpserver---> a71b9bf69a19
Step 4/4 : ENTRYPOINT ["/dockerstudy/httpserver/gohttpserver"]---> Running in f5ac6f75f356
Removing intermediate container f5ac6f75f356---> ffdef51c9a42
Successfully built ffdef51c9a42
Successfully tagged gohttpserver:v1
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker images
REPOSITORY     TAG       IMAGE ID       CREATED          SIZE
gohttpserver   v1        ffdef51c9a42   2 minutes ago    83.9MB
ubuntuwithvm   latest    428e030662bc   56 minutes ago   170MB
ubuntu         latest    d2e4e1f51132   4 days ago       77.8MB
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker run -p 82:81 gohttpserver:v1
环境正常

浏览器:

http://192.168.88.50:82/healthz

可以看到succeed。并且Linux黑窗口会显示:

zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker run -p 82:81 gohttpserver:v1
环境正常
调用healthz接口

说明容器构建成功。

zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS                         PORTS     NAMES
93d3eac39a12   gohttpserver:v1   "/dockerstudy/httpse…"   4 minutes ago       Exited (2) 27 seconds ago                awesome_johnson
c515a662d46c   ubuntu            "/bin/bash"              About an hour ago   Exited (0) About an hour ago             goofy_heisenberg

ctrl+C退出即可。确保容器已经关闭。

推送至hub.docker.com

先创建新的仓库:zhiyongdocker/dockerstudy

官方给出了推送的命令:

docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname

先登录:

zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: zhiyongdocker
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded

修改镜像名称并推送:

zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker images
REPOSITORY     TAG       IMAGE ID       CREATED             SIZE
gohttpserver   v1        ffdef51c9a42   29 minutes ago      83.9MB
ubuntuwithvm   latest    428e030662bc   About an hour ago   170MB
ubuntu         latest    d2e4e1f51132   4 days ago          77.8MB
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker tag gohttpserver:v1 zhiyongdocker/dockerstudy/httpserver:v1
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker images
REPOSITORY                             TAG       IMAGE ID       CREATED             SIZE
gohttpserver                           v1        ffdef51c9a42   30 minutes ago      83.9MB
zhiyongdocker/dockerstudy/httpserver   v1        ffdef51c9a42   30 minutes ago      83.9MB
ubuntuwithvm                           latest    428e030662bc   About an hour ago   170MB
ubuntu                                 latest    d2e4e1f51132   4 days ago          77.8MB
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker push zhiyongdocker/dockerstudy/httpserver:v1
#名称不对会失败
The push refers to repository [docker.io/zhiyongdocker/dockerstudy/httpserver]
b45d2bb1a7ec: Preparing
8a1c3d1d2aba: Preparing
e59fc9495612: Preparing
denied: requested access to the resource is denied
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker images
REPOSITORY                             TAG       IMAGE ID       CREATED             SIZE
gohttpserver                           v1        ffdef51c9a42   34 minutes ago      83.9MB
zhiyongdocker/dockerstudy/httpserver   v1        ffdef51c9a42   34 minutes ago      83.9MB
ubuntuwithvm                           latest    428e030662bc   About an hour ago   170MB
ubuntu                                 latest    d2e4e1f51132   4 days ago          77.8MB
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker tag gohttpserver:v1 zhiyongdocker/dockerstudy:v1
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker images
REPOSITORY                             TAG       IMAGE ID       CREATED             SIZE
gohttpserver                           v1        ffdef51c9a42   34 minutes ago      83.9MB
zhiyongdocker/dockerstudy/httpserver   v1        ffdef51c9a42   34 minutes ago      83.9MB
zhiyongdocker/dockerstudy              v1        ffdef51c9a42   34 minutes ago      83.9MB
ubuntuwithvm                           latest    428e030662bc   About an hour ago   170MB
ubuntu                                 latest    d2e4e1f51132   4 days ago          77.8MB
zhiyong@zhiyong-vm-dev:~/dockerstudy/httpserver$ sudo docker push zhiyongdocker/dockerstudy:v1
The push refers to repository [docker.io/zhiyongdocker/dockerstudy]
b45d2bb1a7ec: Pushed
8a1c3d1d2aba: Pushed
e59fc9495612: Pushed
v1: digest: sha256:94edccac916aeccf113bfdcbd7ce2e35b774839790bdecdab417d5c049021068 size: 947

本地启动http server容器

zhiyong@zhiyong-vm-dev:~$ sudo docker run -p 83:81 zhiyongdocker/dockerstudy:v1
环境正常
调用healthz接口
^Czhiyong@zhiyong-vm-dev:~$ sudo dockeps -a
CONTAINER ID   IMAGE                          COMMAND                  CREATED              STATUS                          PORTS     NAMES
8377df17b1e1   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   20 seconds ago       Exited (2) 5 seconds ago                  zen_ritchie
8e97bbad0d3b   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   About a minute ago   Exited (2) About a minute ago             blissful_black
93d3eac39a12   gohttpserver:v1                "/dockerstudy/httpse…"   35 minutes ago       Exited (2) 31 minutes ago                 awesome_johnson
c515a662d46c   ubuntu                         "/bin/bash"              2 hours ago          Exited (0) 2 hours ago                    goofy_heisenberg

和之前的状态相同。浏览器:

http://192.168.88.50:83/healthz

可以看到succeed,说明容器正常。

进入容器查看 IP 配置

重启容器:

zhiyong@zhiyong-vm-dev:~$ sudo docker ps -a
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS                      PORTS                               NAMES
8377df17b1e1   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   10 minutes ago   Up 37 seconds               0.0.0.0:83->81/tcp, :::83->81/tcp   zen_ritchie
8e97bbad0d3b   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   11 minutes ago   Exited (2) 11 minutes ago                                       blissful_black
93d3eac39a12   gohttpserver:v1                "/dockerstudy/httpse…"   45 minutes ago   Exited (2) 41 minutes ago                                       awesome_johnson
c515a662d46c   ubuntu                         "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                                          goofy_heisenberg
zhiyong@zhiyong-vm-dev:~$ sudo docker stop 8377df17b1e1
8377df17b1e1
zhiyong@zhiyong-vm-dev:~$ sudo docker ps -a
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS                      PORTS     NAMES
8377df17b1e1   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   10 minutes ago   Exited (2) 20 seconds ago             zen_ritchie
8e97bbad0d3b   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   12 minutes ago   Exited (2) 11 minutes ago             blissful_black
93d3eac39a12   gohttpserver:v1                "/dockerstudy/httpse…"   46 minutes ago   Exited (2) 41 minutes ago             awesome_johnson
c515a662d46c   ubuntu                         "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                goofy_heisenberg
zhiyong@zhiyong-vm-dev:~$ sudo docker restart 8377df17b1e1
8377df17b1e1
zhiyong@zhiyong-vm-dev:~$ sudo docker ps -a
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS                      PORTS                               NAMES
8377df17b1e1   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   10 minutes ago   Up 5 seconds                0.0.0.0:83->81/tcp, :::83->81/tcp   zen_ritchie
8e97bbad0d3b   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   12 minutes ago   Exited (2) 11 minutes ago                                       blissful_black
93d3eac39a12   gohttpserver:v1                "/dockerstudy/httpse…"   46 minutes ago   Exited (2) 41 minutes ago                                       awesome_johnson
c515a662d46c   ubuntu                         "/bin/bash"              2 hours ago      Exited (0) 2 hours ago                                          goofy_heisenberg

查看Docker镜像的PID:

zhiyong@zhiyong-vm-dev:~$ sudo docker container top 8377df17b1e1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                17780               17760               0                   01:39               ?                   00:00:00            /dockerstudy/httpserver/gohttpserverzhiyong@zhiyong-vm-dev:~$ sudo docker inspect -f {{.State.Pid}} 8377df17b1e1
17780

查看帮助:

zhiyong@zhiyong-vm-dev:~$ nsenter --help用法:nsenter [选项] [<程序> [<参数>...]]以其他程序的名字空间运行某个程序。选项:-a, --all              enter all namespaces-t, --target <pid>     要获取名字空间的目标进程-m, --mount[=<文件>]   进入 mount 名字空间-u, --uts[=<文件>]     进入 UTS 名字空间(主机名等)-i, --ipc[=<文件>]     进入 System V IPC 名字空间-n, --net[=<文件>]     进入网络名字空间-p, --pid[=<文件>]     进入 pid 名字空间-C, --cgroup[=<文件>]  进入 cgroup 名字空间-U, --user[=<文件>]    进入用户名字空间-T, --time[=<file>]    enter time namespace-S, --setuid <uid>     设置进入空间中的 uid-G, --setgid <gid>     设置进入名字空间中的 gid--preserve-credentials 不干涉 uid 或 gid-r, --root[=<目录>]     设置根目录-w, --wd[=<dir>]       设置工作目录-F, --no-fork          执行 <程序> 前不 fork-Z, --follow-context  根据 --target PID 设置 SELinux 环境-h, --help             display this help-V, --version          display version更多信息请参阅 nsenter(1)。

根据PID进入Docker容器的网络命名空间:

zhiyong@zhiyong-vm-dev:~$ sudo nsenter -n -t17780
root@zhiyong-vm-dev:/home/zhiyong# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
root@zhiyong-vm-dev:/home/zhiyong# exit
注销

查看网络配置:

zhiyong@zhiyong-vm-dev:~$ su - root
密码:
su: 认证失败
zhiyong@zhiyong-vm-dev:~$ sudo su - root
root@zhiyong-vm-dev:~# cd /run/d
dbus/   docker/
root@zhiyong-vm-dev:~# cd /run/docker/
containerd/   libnetwork/   netns/        plugins/      runtime-runc/ swarm/
root@zhiyong-vm-dev:~# cd /run/docker/netns/
root@zhiyong-vm-dev:/run/docker/netns# ll
总用量 0
drwxr-xr-x 2 root root  60  5月  5 01:39 ./
drwx------ 8 root root 180  5月  4 23:38 ../
-r--r--r-- 1 root root   0  5月  5 01:39 2822acc443f5
root@zhiyong-vm-dev:/run/docker/netns# docker ps
CONTAINER ID   IMAGE                          COMMAND                  CREATED          STATUS          PORTS                               NAMES
8377df17b1e1   zhiyongdocker/dockerstudy:v1   "/dockerstudy/httpse…"   31 minutes ago   Up 20 minutes   0.0.0.0:83->81/tcp, :::83->81/tcp   zen_ritchie
root@zhiyong-vm-dev:/run/docker/netns# docker inspect 8377df17b1e1 | grep -i sandbox"SandboxID": "2822acc443f5b4f718b5a4c5d8cdf704868af013b37c257dcc6a69233d29d042","SandboxKey": "/var/run/docker/netns/2822acc443f5",
root@zhiyong-vm-dev:/run/docker/netns# nsenter --net=/var/run/docker/netns/2822acc443f5 sh
# iptables -nvL -t mangle
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destinationChain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destinationChain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target     prot opt in     out     source               destination
# ipvsadm -ln
sh: 2: ipvsadm: not found
# exit
root@zhiyong-vm-dev:/run/docker/netns#

相关的namespace配置如下:

root@zhiyong-vm-dev:/proc# ll /proc/17780/ns
总用量 0
dr-x--x--x 2 root root 0  5月  5 01:39 ./
dr-xr-xr-x 9 root root 0  5月  5 01:39 ../
lrwxrwxrwx 1 root root 0  5月  5 02:05 cgroup -> 'cgroup:[4026532761]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 ipc -> 'ipc:[4026532633]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 mnt -> 'mnt:[4026532631]'
lrwxrwxrwx 1 root root 0  5月  5 01:39 net -> 'net:[4026532636]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 pid -> 'pid:[4026532634]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 pid_for_children -> 'pid:[4026532634]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 time -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 time_for_children -> 'time:[4026531834]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0  5月  5 02:05 uts -> 'uts:[4026532632]'

再次重启容器:

zhiyong@zhiyong-vm-dev:~$ sudo docker restart 8377df17b1e1
8377df17b1e1
zhiyong@zhiyong-vm-dev:~$ sudo docker inspect -f {{.State.Pid}} 8377df17b1e1
18210
zhiyong@zhiyong-vm-dev:~$ sudo nsenter -n -t18210
root@zhiyong-vm-dev:/home/zhiyong# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group defaultlink/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
root@zhiyong-vm-dev:/home/zhiyong# exit
注销

可以看到PID变化,但是容器IP并没有变化。

将Go语言编写的HttpServer部署到Docker并推送到DockerHub相关推荐

  1. 打包docker镜像推送到远程服务器并部署到k8s

    前提条件: 1.docker服务器已开启远程访问,参考<远程docker服务器携带证书连接>. 2.服务器上已经搭建好k8s集群,本文是k8s单点集群用于测试. 在之前的文章中我们已经通过 ...

  2. 【Kubernetes/docker】生成docker镜像推送到hub并在Kubernetes部署应用-20220407

    生成docker镜像推送到hub 参考https://blog.csdn.net/boonya/article/details/74906927 在本地登录docker docker login do ...

  3. [基于harbor部署私有仓库] 4 推送镜像到harbor

    目录 1 场景解释 2 配置推送docker 3 推送 3.1 准备 3.2 标记镜像 3.3 登录docker(可省) 3.4 推送镜像 3.5 查看 4 参考 5 你们可能遇到的问题 5.1 se ...

  4. 打包docker镜像,推送远程服务器,部署到k8s步骤

    打包docker镜像 前提条件 1.docker服务器已开启远程访问,参考<远程docker服务器携带证书连接>. 2.服务器上已经搭建好k8s集群,本文是k8s单点集群用于测试. 在之前 ...

  5. Docker上部署SpringBoot项目并推送镜像到Docker Hub上---以MacOS为例

    Docker部署.镜像推送至Docker Hub.拉取.运行 Docker部署 Dockerfile文件内容 文件内容解释 制作镜像 查看镜像 本地运行镜像 镜像推送.拉取.运行 镜像推送 镜像拉取 ...

  6. k8s管理java项目_Kubernetes集群部署项目-部署Java项目(推送镜像

    Kubernetes(简称k8s)是谷歌开源的一套容器化集群管理系统,当下已被众多大厂及中小企业采用,容器化技术是目前的大势所趋. 本套教程k8s版本升级为最新版1.18.0,内容由浅入深,且更加深化 ...

  7. SignalR2.1部署IIS服务器无法推送消息

    最近在学习SignalR服务器实时推技术,写了个Demo,普通的Asp.netWeb应用程序,IIS访问地址为http://localhost/SignalR_Test/Paint.html,用VS自 ...

  8. SCOM2012部署系列之七:推送Windows监控代理

    在上篇文章中,我们已经成功安装了ACS服务,本文将以sdc01.cool.com这台服务器为例,来看看如何推送安装Windows平台的监控代理.不管是Windows服务器还是Linux服务器,如果希望 ...

  9. k8s集群部署项目_JAVA项目(推送镜像到云镜像服务器_这里使用阿里云)---K8S_Google工作笔记0061

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们把我们做好的java项目的那个docker镜像上传到阿里云上去.推送镜像 首先我们登陆阿里 ...

  10. Bitcoin.com开发人员正创建一个用Rust语言编写的BCH全节点

    近日,Bitcoin.com开发人员Gabriel Cardona在推特表示,自己正创建一个用Rust语言编写的BCH全节点,目的是为了改变完整节点的范式,让BCH代码库更加安全.编程人员技术贡献更加 ...

最新文章

  1. python 遍历xml所有节点
  2. BZOJ 3504: [Cqoi2014]危桥 [最大流]
  3. linux ubuntu16.04 编译opencv教程(没编过,有时间再弄,推流不用opencv也行的)
  4. 网页编程从入门到精通 杨凡_干货 | web前端入门基础知识
  5. CS231n Convolutional Neural Networks for Visual Recognition------Python Tutorial
  6. localstorage本地缓存
  7. 【TensorFlow】TensorFlow函数精讲之tf.truncated_normal()
  8. 用汇编的眼光看C++(之算术符重载)
  9. python语言与c语言相比在分支结构上有什么不同_C语言顺序结构和分支结构总结...
  10. CSP202009-1 称检测点查询(100分)【数学】
  11. 计算机辅助设计排版,计算机辅助设计
  12. Codeforces 474B. Worms
  13. python 读取outlook邮箱邮件小记
  14. 中国历史朝代变迁简介
  15. 科学计算机r系数的操作,相关系数,确定系数(R^2)计算公式与在线计算器_三贝计算网_23bei.com...
  16. iOS开发工程师面试题--中级
  17. html页面禁止竖屏,关于移动端页面强制竖屏的方法
  18. 默认模式网络(Default mode network, DMN)
  19. .shape()与.reshape()函数
  20. 三十而已 豆瓣短评分析

热门文章

  1. 机器学习入门之线性回归(1)- 单特征(python实现)
  2. ansible中的file、cron、debug、template、lineinfile、blockinfile模块的介绍和使用
  3. 世界经典名车中英名称对照
  4. 安装Django 文档
  5. Debug无忧!清华校友打造Python调试神器!
  6. HDU 6599 Palindromic_Automaton
  7. Linux和Windows双系统下,找回丢失Windows启动项
  8. 文件系统以及硬盘分区概念
  9. python 字符串(二)
  10. 愚人节、物联网、飞鸽与IP